15e3dd157SKalle Valo /* 25e3dd157SKalle Valo * Copyright (c) 2005-2011 Atheros Communications Inc. 35e3dd157SKalle Valo * Copyright (c) 2011-2013 Qualcomm Atheros, Inc. 45e3dd157SKalle Valo * 55e3dd157SKalle Valo * Permission to use, copy, modify, and/or distribute this software for any 65e3dd157SKalle Valo * purpose with or without fee is hereby granted, provided that the above 75e3dd157SKalle Valo * copyright notice and this permission notice appear in all copies. 85e3dd157SKalle Valo * 95e3dd157SKalle Valo * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 105e3dd157SKalle Valo * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 115e3dd157SKalle Valo * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 125e3dd157SKalle Valo * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 135e3dd157SKalle Valo * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 145e3dd157SKalle Valo * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 155e3dd157SKalle Valo * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 165e3dd157SKalle Valo */ 175e3dd157SKalle Valo 185e3dd157SKalle Valo #include <linux/skbuff.h> 192fe5288cSKalle Valo #include <linux/ctype.h> 205e3dd157SKalle Valo 215e3dd157SKalle Valo #include "core.h" 225e3dd157SKalle Valo #include "htc.h" 235e3dd157SKalle Valo #include "debug.h" 245e3dd157SKalle Valo #include "wmi.h" 25ca996ec5SMichal Kazior #include "wmi-tlv.h" 265e3dd157SKalle Valo #include "mac.h" 2743d2a30fSKalle Valo #include "testmode.h" 28d7579d12SMichal Kazior #include "wmi-ops.h" 296a94888fSMichal Kazior #include "p2p.h" 30587f7031SMichal Kazior #include "hw.h" 315e3dd157SKalle Valo 32ce42870eSBartosz Markowski /* MAIN WMI cmd track */ 33ce42870eSBartosz Markowski static struct wmi_cmd_map wmi_cmd_map = { 34ce42870eSBartosz Markowski .init_cmdid = WMI_INIT_CMDID, 35ce42870eSBartosz Markowski .start_scan_cmdid = WMI_START_SCAN_CMDID, 36ce42870eSBartosz Markowski .stop_scan_cmdid = WMI_STOP_SCAN_CMDID, 37ce42870eSBartosz Markowski .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID, 38ce42870eSBartosz Markowski .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID, 39ce42870eSBartosz Markowski .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID, 40ce42870eSBartosz Markowski .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID, 41ce42870eSBartosz Markowski .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID, 42ce42870eSBartosz Markowski .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID, 43ce42870eSBartosz Markowski .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID, 44ce42870eSBartosz Markowski .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID, 45ce42870eSBartosz Markowski .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID, 46ce42870eSBartosz Markowski .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID, 47ce42870eSBartosz Markowski .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID, 48ce42870eSBartosz Markowski .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID, 49ce42870eSBartosz Markowski .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID, 50ce42870eSBartosz Markowski .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID, 51ce42870eSBartosz Markowski .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID, 52ce42870eSBartosz Markowski .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID, 53ce42870eSBartosz Markowski .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID, 54ce42870eSBartosz Markowski .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID, 55ce42870eSBartosz Markowski .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID, 56ce42870eSBartosz Markowski .vdev_up_cmdid = WMI_VDEV_UP_CMDID, 57ce42870eSBartosz Markowski .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID, 58ce42870eSBartosz Markowski .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID, 59ce42870eSBartosz Markowski .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID, 60ce42870eSBartosz Markowski .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID, 61ce42870eSBartosz Markowski .peer_create_cmdid = WMI_PEER_CREATE_CMDID, 62ce42870eSBartosz Markowski .peer_delete_cmdid = WMI_PEER_DELETE_CMDID, 63ce42870eSBartosz Markowski .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID, 64ce42870eSBartosz Markowski .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID, 65ce42870eSBartosz Markowski .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID, 66ce42870eSBartosz Markowski .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID, 67ce42870eSBartosz Markowski .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID, 68ce42870eSBartosz Markowski .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID, 69ce42870eSBartosz Markowski .bcn_tx_cmdid = WMI_BCN_TX_CMDID, 70ce42870eSBartosz Markowski .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID, 71ce42870eSBartosz Markowski .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID, 72ce42870eSBartosz Markowski .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID, 73ce42870eSBartosz Markowski .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID, 74ce42870eSBartosz Markowski .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID, 75ce42870eSBartosz Markowski .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID, 76ce42870eSBartosz Markowski .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID, 77ce42870eSBartosz Markowski .addba_send_cmdid = WMI_ADDBA_SEND_CMDID, 78ce42870eSBartosz Markowski .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID, 79ce42870eSBartosz Markowski .delba_send_cmdid = WMI_DELBA_SEND_CMDID, 80ce42870eSBartosz Markowski .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID, 81ce42870eSBartosz Markowski .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID, 82ce42870eSBartosz Markowski .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID, 83ce42870eSBartosz Markowski .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID, 84ce42870eSBartosz Markowski .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID, 85ce42870eSBartosz Markowski .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID, 86ce42870eSBartosz Markowski .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID, 87ce42870eSBartosz Markowski .roam_scan_mode = WMI_ROAM_SCAN_MODE, 88ce42870eSBartosz Markowski .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD, 89ce42870eSBartosz Markowski .roam_scan_period = WMI_ROAM_SCAN_PERIOD, 90ce42870eSBartosz Markowski .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 91ce42870eSBartosz Markowski .roam_ap_profile = WMI_ROAM_AP_PROFILE, 92ce42870eSBartosz Markowski .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE, 93ce42870eSBartosz Markowski .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE, 94ce42870eSBartosz Markowski .ofl_scan_period = WMI_OFL_SCAN_PERIOD, 95ce42870eSBartosz Markowski .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO, 96ce42870eSBartosz Markowski .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY, 97ce42870eSBartosz Markowski .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE, 98ce42870eSBartosz Markowski .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE, 99ce42870eSBartosz Markowski .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID, 100ce42870eSBartosz Markowski .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID, 101ce42870eSBartosz Markowski .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID, 102ce42870eSBartosz Markowski .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID, 103ce42870eSBartosz Markowski .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID, 104ce42870eSBartosz Markowski .wlan_profile_set_hist_intvl_cmdid = 105ce42870eSBartosz Markowski WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 106ce42870eSBartosz Markowski .wlan_profile_get_profile_data_cmdid = 107ce42870eSBartosz Markowski WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 108ce42870eSBartosz Markowski .wlan_profile_enable_profile_id_cmdid = 109ce42870eSBartosz Markowski WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 110ce42870eSBartosz Markowski .wlan_profile_list_profile_id_cmdid = 111ce42870eSBartosz Markowski WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 112ce42870eSBartosz Markowski .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID, 113ce42870eSBartosz Markowski .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID, 114ce42870eSBartosz Markowski .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID, 115ce42870eSBartosz Markowski .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID, 116ce42870eSBartosz Markowski .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID, 117ce42870eSBartosz Markowski .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID, 118ce42870eSBartosz Markowski .wow_enable_disable_wake_event_cmdid = 119ce42870eSBartosz Markowski WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 120ce42870eSBartosz Markowski .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID, 121ce42870eSBartosz Markowski .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 122ce42870eSBartosz Markowski .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID, 123ce42870eSBartosz Markowski .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID, 124ce42870eSBartosz Markowski .vdev_spectral_scan_configure_cmdid = 125ce42870eSBartosz Markowski WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 126ce42870eSBartosz Markowski .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 127ce42870eSBartosz Markowski .request_stats_cmdid = WMI_REQUEST_STATS_CMDID, 128ce42870eSBartosz Markowski .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID, 129ce42870eSBartosz Markowski .network_list_offload_config_cmdid = 130ce42870eSBartosz Markowski WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID, 131ce42870eSBartosz Markowski .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID, 132ce42870eSBartosz Markowski .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID, 133ce42870eSBartosz Markowski .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID, 134ce42870eSBartosz Markowski .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID, 135ce42870eSBartosz Markowski .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID, 136ce42870eSBartosz Markowski .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID, 137ce42870eSBartosz Markowski .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID, 138ce42870eSBartosz Markowski .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID, 139ce42870eSBartosz Markowski .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD, 140ce42870eSBartosz Markowski .echo_cmdid = WMI_ECHO_CMDID, 141ce42870eSBartosz Markowski .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID, 142ce42870eSBartosz Markowski .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID, 143ce42870eSBartosz Markowski .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID, 144ce42870eSBartosz Markowski .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID, 145ce42870eSBartosz Markowski .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID, 146ce42870eSBartosz Markowski .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID, 147ce42870eSBartosz Markowski .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID, 148ce42870eSBartosz Markowski .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID, 149ce42870eSBartosz Markowski .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID, 150a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 151772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 152772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 153772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 154772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 155772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 156772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 157772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 158772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 159772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 160772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 161772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 162772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 163772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 164772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 165772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 166772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 167772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 168772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 169772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 170772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 171772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 172772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 173772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 174772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 175772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 176772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 177772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 178772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 179772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 180772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 181772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 182772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 183772b4aeeSRaja Mani .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 184772b4aeeSRaja Mani .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 185772b4aeeSRaja Mani .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 186772b4aeeSRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 187772b4aeeSRaja Mani .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 188772b4aeeSRaja Mani .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 189772b4aeeSRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 190772b4aeeSRaja Mani .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 191772b4aeeSRaja Mani .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 192772b4aeeSRaja Mani .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED, 193ce42870eSBartosz Markowski }; 194ce42870eSBartosz Markowski 195b7e3adf9SBartosz Markowski /* 10.X WMI cmd track */ 196b7e3adf9SBartosz Markowski static struct wmi_cmd_map wmi_10x_cmd_map = { 197b7e3adf9SBartosz Markowski .init_cmdid = WMI_10X_INIT_CMDID, 198b7e3adf9SBartosz Markowski .start_scan_cmdid = WMI_10X_START_SCAN_CMDID, 199b7e3adf9SBartosz Markowski .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID, 200b7e3adf9SBartosz Markowski .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID, 20134957b25SBartosz Markowski .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 202b7e3adf9SBartosz Markowski .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID, 203b7e3adf9SBartosz Markowski .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID, 204b7e3adf9SBartosz Markowski .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID, 205b7e3adf9SBartosz Markowski .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID, 206b7e3adf9SBartosz Markowski .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID, 207b7e3adf9SBartosz Markowski .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID, 208b7e3adf9SBartosz Markowski .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID, 209b7e3adf9SBartosz Markowski .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID, 210b7e3adf9SBartosz Markowski .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID, 211b7e3adf9SBartosz Markowski .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID, 212b7e3adf9SBartosz Markowski .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID, 213b7e3adf9SBartosz Markowski .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID, 214b7e3adf9SBartosz Markowski .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID, 215b7e3adf9SBartosz Markowski .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID, 216b7e3adf9SBartosz Markowski .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID, 217b7e3adf9SBartosz Markowski .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID, 218b7e3adf9SBartosz Markowski .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID, 219b7e3adf9SBartosz Markowski .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID, 220b7e3adf9SBartosz Markowski .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID, 221b7e3adf9SBartosz Markowski .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID, 222b7e3adf9SBartosz Markowski .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID, 223b7e3adf9SBartosz Markowski .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID, 224b7e3adf9SBartosz Markowski .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID, 225b7e3adf9SBartosz Markowski .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID, 226b7e3adf9SBartosz Markowski .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID, 227b7e3adf9SBartosz Markowski .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID, 228b7e3adf9SBartosz Markowski .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID, 229b7e3adf9SBartosz Markowski .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID, 230b7e3adf9SBartosz Markowski .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID, 231b7e3adf9SBartosz Markowski .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID, 232b7e3adf9SBartosz Markowski .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID, 233b7e3adf9SBartosz Markowski .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID, 23434957b25SBartosz Markowski .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 235b7e3adf9SBartosz Markowski .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID, 236b7e3adf9SBartosz Markowski .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID, 237b7e3adf9SBartosz Markowski .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID, 23834957b25SBartosz Markowski .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 239b7e3adf9SBartosz Markowski .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID, 240b7e3adf9SBartosz Markowski .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID, 241b7e3adf9SBartosz Markowski .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID, 242b7e3adf9SBartosz Markowski .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID, 243b7e3adf9SBartosz Markowski .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID, 244b7e3adf9SBartosz Markowski .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID, 245b7e3adf9SBartosz Markowski .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID, 246b7e3adf9SBartosz Markowski .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID, 247b7e3adf9SBartosz Markowski .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID, 248b7e3adf9SBartosz Markowski .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID, 249b7e3adf9SBartosz Markowski .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID, 250b7e3adf9SBartosz Markowski .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE, 251b7e3adf9SBartosz Markowski .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD, 252b7e3adf9SBartosz Markowski .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD, 253b7e3adf9SBartosz Markowski .roam_scan_rssi_change_threshold = 254b7e3adf9SBartosz Markowski WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 255b7e3adf9SBartosz Markowski .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE, 256b7e3adf9SBartosz Markowski .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE, 257b7e3adf9SBartosz Markowski .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE, 258b7e3adf9SBartosz Markowski .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD, 259b7e3adf9SBartosz Markowski .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO, 260b7e3adf9SBartosz Markowski .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY, 261b7e3adf9SBartosz Markowski .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE, 262b7e3adf9SBartosz Markowski .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE, 26334957b25SBartosz Markowski .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 264542fb174SJanusz Dziedzic .ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID, 26534957b25SBartosz Markowski .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 266b7e3adf9SBartosz Markowski .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID, 267b7e3adf9SBartosz Markowski .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID, 268b7e3adf9SBartosz Markowski .wlan_profile_set_hist_intvl_cmdid = 269b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 270b7e3adf9SBartosz Markowski .wlan_profile_get_profile_data_cmdid = 271b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 272b7e3adf9SBartosz Markowski .wlan_profile_enable_profile_id_cmdid = 273b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 274b7e3adf9SBartosz Markowski .wlan_profile_list_profile_id_cmdid = 275b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 276b7e3adf9SBartosz Markowski .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID, 277b7e3adf9SBartosz Markowski .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID, 278b7e3adf9SBartosz Markowski .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID, 279b7e3adf9SBartosz Markowski .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID, 280b7e3adf9SBartosz Markowski .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID, 281b7e3adf9SBartosz Markowski .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID, 282b7e3adf9SBartosz Markowski .wow_enable_disable_wake_event_cmdid = 283b7e3adf9SBartosz Markowski WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 284b7e3adf9SBartosz Markowski .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID, 285b7e3adf9SBartosz Markowski .wow_hostwakeup_from_sleep_cmdid = 286b7e3adf9SBartosz Markowski WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 287b7e3adf9SBartosz Markowski .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID, 288b7e3adf9SBartosz Markowski .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID, 289b7e3adf9SBartosz Markowski .vdev_spectral_scan_configure_cmdid = 290b7e3adf9SBartosz Markowski WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 291b7e3adf9SBartosz Markowski .vdev_spectral_scan_enable_cmdid = 292b7e3adf9SBartosz Markowski WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 293b7e3adf9SBartosz Markowski .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID, 29434957b25SBartosz Markowski .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 29534957b25SBartosz Markowski .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 29634957b25SBartosz Markowski .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 29734957b25SBartosz Markowski .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 29834957b25SBartosz Markowski .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 29934957b25SBartosz Markowski .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 30034957b25SBartosz Markowski .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 30134957b25SBartosz Markowski .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 30234957b25SBartosz Markowski .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 30334957b25SBartosz Markowski .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 30434957b25SBartosz Markowski .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 305b7e3adf9SBartosz Markowski .echo_cmdid = WMI_10X_ECHO_CMDID, 306b7e3adf9SBartosz Markowski .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID, 307b7e3adf9SBartosz Markowski .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID, 308b7e3adf9SBartosz Markowski .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID, 30934957b25SBartosz Markowski .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 31034957b25SBartosz Markowski .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 31134957b25SBartosz Markowski .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 31234957b25SBartosz Markowski .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 313b7e3adf9SBartosz Markowski .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID, 314b7e3adf9SBartosz Markowski .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID, 315a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 316772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 317772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 318772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 319772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 320772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 321772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 322772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 323772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 324772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 325772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 326772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 327772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 328772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 329772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 330772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 331772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 332772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 333772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 334772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 335772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 336772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 337772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 338772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 339772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 340772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 341772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 342772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 343772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 344772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 345772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 346772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 347772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 348772b4aeeSRaja Mani .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 349772b4aeeSRaja Mani .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 350772b4aeeSRaja Mani .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 351772b4aeeSRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 352772b4aeeSRaja Mani .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 353772b4aeeSRaja Mani .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 354772b4aeeSRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 355772b4aeeSRaja Mani .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 356772b4aeeSRaja Mani .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 357772b4aeeSRaja Mani .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED, 358b7e3adf9SBartosz Markowski }; 359ce42870eSBartosz Markowski 3604a16fbecSRajkumar Manoharan /* 10.2.4 WMI cmd track */ 3614a16fbecSRajkumar Manoharan static struct wmi_cmd_map wmi_10_2_4_cmd_map = { 3624a16fbecSRajkumar Manoharan .init_cmdid = WMI_10_2_INIT_CMDID, 3634a16fbecSRajkumar Manoharan .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID, 3644a16fbecSRajkumar Manoharan .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID, 3654a16fbecSRajkumar Manoharan .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID, 3664a16fbecSRajkumar Manoharan .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 3674a16fbecSRajkumar Manoharan .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID, 3684a16fbecSRajkumar Manoharan .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID, 3694a16fbecSRajkumar Manoharan .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID, 3704a16fbecSRajkumar Manoharan .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID, 3714a16fbecSRajkumar Manoharan .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID, 3724a16fbecSRajkumar Manoharan .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID, 3734a16fbecSRajkumar Manoharan .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID, 3744a16fbecSRajkumar Manoharan .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID, 3754a16fbecSRajkumar Manoharan .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID, 3764a16fbecSRajkumar Manoharan .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID, 3774a16fbecSRajkumar Manoharan .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID, 3784a16fbecSRajkumar Manoharan .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID, 3794a16fbecSRajkumar Manoharan .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID, 3804a16fbecSRajkumar Manoharan .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID, 3814a16fbecSRajkumar Manoharan .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID, 3824a16fbecSRajkumar Manoharan .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID, 3834a16fbecSRajkumar Manoharan .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID, 3844a16fbecSRajkumar Manoharan .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID, 3854a16fbecSRajkumar Manoharan .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID, 3864a16fbecSRajkumar Manoharan .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID, 3874a16fbecSRajkumar Manoharan .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID, 3884a16fbecSRajkumar Manoharan .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID, 3894a16fbecSRajkumar Manoharan .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID, 3904a16fbecSRajkumar Manoharan .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID, 3914a16fbecSRajkumar Manoharan .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID, 3924a16fbecSRajkumar Manoharan .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID, 3934a16fbecSRajkumar Manoharan .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID, 3944a16fbecSRajkumar Manoharan .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID, 3954a16fbecSRajkumar Manoharan .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID, 3964a16fbecSRajkumar Manoharan .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID, 3974a16fbecSRajkumar Manoharan .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID, 3984a16fbecSRajkumar Manoharan .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 3994a16fbecSRajkumar Manoharan .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID, 4004a16fbecSRajkumar Manoharan .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID, 4014a16fbecSRajkumar Manoharan .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID, 4024a16fbecSRajkumar Manoharan .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 4034a16fbecSRajkumar Manoharan .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID, 4044a16fbecSRajkumar Manoharan .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID, 4054a16fbecSRajkumar Manoharan .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID, 4064a16fbecSRajkumar Manoharan .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID, 4074a16fbecSRajkumar Manoharan .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID, 4084a16fbecSRajkumar Manoharan .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID, 4094a16fbecSRajkumar Manoharan .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID, 4104a16fbecSRajkumar Manoharan .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID, 4114a16fbecSRajkumar Manoharan .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID, 4124a16fbecSRajkumar Manoharan .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID, 4134a16fbecSRajkumar Manoharan .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID, 4144a16fbecSRajkumar Manoharan .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE, 4154a16fbecSRajkumar Manoharan .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD, 4164a16fbecSRajkumar Manoharan .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD, 4174a16fbecSRajkumar Manoharan .roam_scan_rssi_change_threshold = 4184a16fbecSRajkumar Manoharan WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 4194a16fbecSRajkumar Manoharan .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE, 4204a16fbecSRajkumar Manoharan .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE, 4214a16fbecSRajkumar Manoharan .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE, 4224a16fbecSRajkumar Manoharan .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD, 4234a16fbecSRajkumar Manoharan .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO, 4244a16fbecSRajkumar Manoharan .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY, 4254a16fbecSRajkumar Manoharan .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE, 4264a16fbecSRajkumar Manoharan .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE, 4274a16fbecSRajkumar Manoharan .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 4284a16fbecSRajkumar Manoharan .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID, 4294a16fbecSRajkumar Manoharan .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 4304a16fbecSRajkumar Manoharan .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID, 4314a16fbecSRajkumar Manoharan .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID, 4324a16fbecSRajkumar Manoharan .wlan_profile_set_hist_intvl_cmdid = 4334a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 4344a16fbecSRajkumar Manoharan .wlan_profile_get_profile_data_cmdid = 4354a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 4364a16fbecSRajkumar Manoharan .wlan_profile_enable_profile_id_cmdid = 4374a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 4384a16fbecSRajkumar Manoharan .wlan_profile_list_profile_id_cmdid = 4394a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 4404a16fbecSRajkumar Manoharan .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID, 4414a16fbecSRajkumar Manoharan .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID, 4424a16fbecSRajkumar Manoharan .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID, 4434a16fbecSRajkumar Manoharan .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID, 4444a16fbecSRajkumar Manoharan .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID, 4454a16fbecSRajkumar Manoharan .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID, 4464a16fbecSRajkumar Manoharan .wow_enable_disable_wake_event_cmdid = 4474a16fbecSRajkumar Manoharan WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 4484a16fbecSRajkumar Manoharan .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID, 4494a16fbecSRajkumar Manoharan .wow_hostwakeup_from_sleep_cmdid = 4504a16fbecSRajkumar Manoharan WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 4514a16fbecSRajkumar Manoharan .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID, 4524a16fbecSRajkumar Manoharan .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID, 4534a16fbecSRajkumar Manoharan .vdev_spectral_scan_configure_cmdid = 4544a16fbecSRajkumar Manoharan WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 4554a16fbecSRajkumar Manoharan .vdev_spectral_scan_enable_cmdid = 4564a16fbecSRajkumar Manoharan WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 4574a16fbecSRajkumar Manoharan .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID, 4584a16fbecSRajkumar Manoharan .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 4594a16fbecSRajkumar Manoharan .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 4604a16fbecSRajkumar Manoharan .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 4614a16fbecSRajkumar Manoharan .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 4624a16fbecSRajkumar Manoharan .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 4634a16fbecSRajkumar Manoharan .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 4644a16fbecSRajkumar Manoharan .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 4654a16fbecSRajkumar Manoharan .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 4664a16fbecSRajkumar Manoharan .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 4674a16fbecSRajkumar Manoharan .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 4684a16fbecSRajkumar Manoharan .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 4694a16fbecSRajkumar Manoharan .echo_cmdid = WMI_10_2_ECHO_CMDID, 4704a16fbecSRajkumar Manoharan .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID, 4714a16fbecSRajkumar Manoharan .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID, 4724a16fbecSRajkumar Manoharan .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID, 4734a16fbecSRajkumar Manoharan .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 4744a16fbecSRajkumar Manoharan .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 4754a16fbecSRajkumar Manoharan .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 4764a16fbecSRajkumar Manoharan .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 4774a16fbecSRajkumar Manoharan .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, 4784a16fbecSRajkumar Manoharan .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, 479a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID, 480772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 481772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 482772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 483772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 484772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 485772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 486772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 487772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 488772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 489772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 490772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 491772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 492772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 493772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 494772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 495772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 496772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 497772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 498772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 499772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 500772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 501772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 502772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 503772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 504772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 505772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 506772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 507772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 508772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 509772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 510772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 511772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 512772b4aeeSRaja Mani .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 513772b4aeeSRaja Mani .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 514772b4aeeSRaja Mani .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 515772b4aeeSRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 516772b4aeeSRaja Mani .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 517772b4aeeSRaja Mani .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 518772b4aeeSRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 519772b4aeeSRaja Mani .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 520772b4aeeSRaja Mani .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 521772b4aeeSRaja Mani .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED, 5224a16fbecSRajkumar Manoharan }; 5234a16fbecSRajkumar Manoharan 5242d491e69SRaja Mani /* 10.4 WMI cmd track */ 5252d491e69SRaja Mani static struct wmi_cmd_map wmi_10_4_cmd_map = { 5262d491e69SRaja Mani .init_cmdid = WMI_10_4_INIT_CMDID, 5272d491e69SRaja Mani .start_scan_cmdid = WMI_10_4_START_SCAN_CMDID, 5282d491e69SRaja Mani .stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID, 5292d491e69SRaja Mani .scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID, 5302d491e69SRaja Mani .scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID, 5312d491e69SRaja Mani .pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID, 5322d491e69SRaja Mani .pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID, 5332d491e69SRaja Mani .pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID, 5342d491e69SRaja Mani .pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID, 5352d491e69SRaja Mani .pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID, 5362d491e69SRaja Mani .pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID, 5372d491e69SRaja Mani .pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID, 5382d491e69SRaja Mani .pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID, 5392d491e69SRaja Mani .pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID, 5402d491e69SRaja Mani .pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID, 5412d491e69SRaja Mani .pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID, 5422d491e69SRaja Mani .pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID, 5432d491e69SRaja Mani .pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID, 5442d491e69SRaja Mani .vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID, 5452d491e69SRaja Mani .vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID, 5462d491e69SRaja Mani .vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID, 5472d491e69SRaja Mani .vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID, 5482d491e69SRaja Mani .vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID, 5492d491e69SRaja Mani .vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID, 5502d491e69SRaja Mani .vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID, 5512d491e69SRaja Mani .vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID, 5522d491e69SRaja Mani .vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID, 5532d491e69SRaja Mani .peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID, 5542d491e69SRaja Mani .peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID, 5552d491e69SRaja Mani .peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID, 5562d491e69SRaja Mani .peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID, 5572d491e69SRaja Mani .peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID, 5582d491e69SRaja Mani .peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID, 5592d491e69SRaja Mani .peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID, 5602d491e69SRaja Mani .peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID, 5612d491e69SRaja Mani .bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID, 5622d491e69SRaja Mani .pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID, 5632d491e69SRaja Mani .bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID, 5642d491e69SRaja Mani .bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID, 5652d491e69SRaja Mani .prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID, 5662d491e69SRaja Mani .mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID, 5672d491e69SRaja Mani .prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID, 5682d491e69SRaja Mani .addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID, 5692d491e69SRaja Mani .addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID, 5702d491e69SRaja Mani .addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID, 5712d491e69SRaja Mani .delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID, 5722d491e69SRaja Mani .addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID, 5732d491e69SRaja Mani .send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID, 5742d491e69SRaja Mani .sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID, 5752d491e69SRaja Mani .sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID, 5762d491e69SRaja Mani .sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID, 5772d491e69SRaja Mani .pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID, 5782d491e69SRaja Mani .pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID, 5792d491e69SRaja Mani .roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE, 5802d491e69SRaja Mani .roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD, 5812d491e69SRaja Mani .roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD, 5822d491e69SRaja Mani .roam_scan_rssi_change_threshold = 5832d491e69SRaja Mani WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 5842d491e69SRaja Mani .roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE, 5852d491e69SRaja Mani .ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE, 5862d491e69SRaja Mani .ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE, 5872d491e69SRaja Mani .ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD, 5882d491e69SRaja Mani .p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO, 5892d491e69SRaja Mani .p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY, 5902d491e69SRaja Mani .p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE, 5912d491e69SRaja Mani .p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE, 5922d491e69SRaja Mani .p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID, 5932d491e69SRaja Mani .ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID, 5942d491e69SRaja Mani .ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID, 5952d491e69SRaja Mani .peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID, 5962d491e69SRaja Mani .wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID, 5972d491e69SRaja Mani .wlan_profile_set_hist_intvl_cmdid = 5982d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 5992d491e69SRaja Mani .wlan_profile_get_profile_data_cmdid = 6002d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 6012d491e69SRaja Mani .wlan_profile_enable_profile_id_cmdid = 6022d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 6032d491e69SRaja Mani .wlan_profile_list_profile_id_cmdid = 6042d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 6052d491e69SRaja Mani .pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID, 6062d491e69SRaja Mani .pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID, 6072d491e69SRaja Mani .add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID, 6082d491e69SRaja Mani .rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID, 6092d491e69SRaja Mani .wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID, 6102d491e69SRaja Mani .wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID, 6112d491e69SRaja Mani .wow_enable_disable_wake_event_cmdid = 6122d491e69SRaja Mani WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 6132d491e69SRaja Mani .wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID, 6142d491e69SRaja Mani .wow_hostwakeup_from_sleep_cmdid = 6152d491e69SRaja Mani WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 6162d491e69SRaja Mani .rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID, 6172d491e69SRaja Mani .rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID, 6182d491e69SRaja Mani .vdev_spectral_scan_configure_cmdid = 6192d491e69SRaja Mani WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 6202d491e69SRaja Mani .vdev_spectral_scan_enable_cmdid = 6212d491e69SRaja Mani WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 6222d491e69SRaja Mani .request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID, 6232d491e69SRaja Mani .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 6242d491e69SRaja Mani .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 6252d491e69SRaja Mani .gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID, 6262d491e69SRaja Mani .csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID, 6272d491e69SRaja Mani .csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID, 6282d491e69SRaja Mani .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 6292d491e69SRaja Mani .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 6302d491e69SRaja Mani .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 6312d491e69SRaja Mani .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 6322d491e69SRaja Mani .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 6332d491e69SRaja Mani .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 6342d491e69SRaja Mani .echo_cmdid = WMI_10_4_ECHO_CMDID, 6352d491e69SRaja Mani .pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID, 6362d491e69SRaja Mani .dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID, 6372d491e69SRaja Mani .pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID, 6382d491e69SRaja Mani .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 6392d491e69SRaja Mani .vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID, 6402d491e69SRaja Mani .vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID, 6412d491e69SRaja Mani .force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID, 6422d491e69SRaja Mani .gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID, 6432d491e69SRaja Mani .gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID, 6442d491e69SRaja Mani .pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID, 6452d491e69SRaja Mani .vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED, 6462d491e69SRaja Mani .tdls_set_state_cmdid = WMI_CMD_UNSUPPORTED, 6472d491e69SRaja Mani .tdls_peer_update_cmdid = WMI_CMD_UNSUPPORTED, 6482d491e69SRaja Mani .adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED, 6492d491e69SRaja Mani .scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID, 6502d491e69SRaja Mani .vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID, 6512d491e69SRaja Mani .vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID, 6522d491e69SRaja Mani .wlan_peer_caching_add_peer_cmdid = 6532d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID, 6542d491e69SRaja Mani .wlan_peer_caching_evict_peer_cmdid = 6552d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID, 6562d491e69SRaja Mani .wlan_peer_caching_restore_peer_cmdid = 6572d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID, 6582d491e69SRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = 6592d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID, 6602d491e69SRaja Mani .peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID, 6612d491e69SRaja Mani .peer_add_proxy_sta_entry_cmdid = 6622d491e69SRaja Mani WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID, 6632d491e69SRaja Mani .rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID, 6642d491e69SRaja Mani .oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID, 6652d491e69SRaja Mani .nan_cmdid = WMI_10_4_NAN_CMDID, 6662d491e69SRaja Mani .vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID, 6672d491e69SRaja Mani .qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID, 6682d491e69SRaja Mani .pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID, 6692d491e69SRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = 6702d491e69SRaja Mani WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID, 6712d491e69SRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = 6722d491e69SRaja Mani WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID, 6732d491e69SRaja Mani .peer_smart_ant_set_train_info_cmdid = 6742d491e69SRaja Mani WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID, 6752d491e69SRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = 6762d491e69SRaja Mani WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID, 6772d491e69SRaja Mani .pdev_set_antenna_switch_table_cmdid = 6782d491e69SRaja Mani WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID, 6792d491e69SRaja Mani .pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID, 6802d491e69SRaja Mani .pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID, 6812d491e69SRaja Mani .pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID, 6822d491e69SRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = 6832d491e69SRaja Mani WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID, 6842d491e69SRaja Mani .pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID, 6852d491e69SRaja Mani .tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID, 6862d491e69SRaja Mani .fwtest_cmdid = WMI_10_4_FWTEST_CMDID, 6872d491e69SRaja Mani .vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID, 6882d491e69SRaja Mani .peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID, 6892d491e69SRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID, 6902d491e69SRaja Mani .pdev_get_ani_ofdm_config_cmdid = 6912d491e69SRaja Mani WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID, 6922d491e69SRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID, 6932d491e69SRaja Mani .pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID, 6942d491e69SRaja Mani .pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID, 6952d491e69SRaja Mani .pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID, 6962d491e69SRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID, 6972d491e69SRaja Mani .pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID, 6982d491e69SRaja Mani .vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID, 6992d491e69SRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = 7002d491e69SRaja Mani WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID, 7012d491e69SRaja Mani .mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID, 7022d491e69SRaja Mani .set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID, 7032d491e69SRaja Mani .pdev_bss_chan_info_request_cmdid = 7042d491e69SRaja Mani WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID, 7052d491e69SRaja Mani }; 7062d491e69SRaja Mani 7076d1506e7SBartosz Markowski /* MAIN WMI VDEV param map */ 7086d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_vdev_param_map = { 7096d1506e7SBartosz Markowski .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD, 7106d1506e7SBartosz Markowski .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 7116d1506e7SBartosz Markowski .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL, 7126d1506e7SBartosz Markowski .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL, 7136d1506e7SBartosz Markowski .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE, 7146d1506e7SBartosz Markowski .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE, 7156d1506e7SBartosz Markowski .slot_time = WMI_VDEV_PARAM_SLOT_TIME, 7166d1506e7SBartosz Markowski .preamble = WMI_VDEV_PARAM_PREAMBLE, 7176d1506e7SBartosz Markowski .swba_time = WMI_VDEV_PARAM_SWBA_TIME, 7186d1506e7SBartosz Markowski .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD, 7196d1506e7SBartosz Markowski .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME, 7206d1506e7SBartosz Markowski .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL, 7216d1506e7SBartosz Markowski .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD, 7226d1506e7SBartosz Markowski .wmi_vdev_oc_scheduler_air_time_limit = 7236d1506e7SBartosz Markowski WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 7246d1506e7SBartosz Markowski .wds = WMI_VDEV_PARAM_WDS, 7256d1506e7SBartosz Markowski .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW, 7266d1506e7SBartosz Markowski .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX, 7276d1506e7SBartosz Markowski .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT, 7286d1506e7SBartosz Markowski .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT, 7296d1506e7SBartosz Markowski .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM, 7306d1506e7SBartosz Markowski .chwidth = WMI_VDEV_PARAM_CHWIDTH, 7316d1506e7SBartosz Markowski .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET, 7326d1506e7SBartosz Markowski .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION, 7336d1506e7SBartosz Markowski .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT, 7346d1506e7SBartosz Markowski .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE, 7356d1506e7SBartosz Markowski .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE, 7366d1506e7SBartosz Markowski .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE, 7376d1506e7SBartosz Markowski .sgi = WMI_VDEV_PARAM_SGI, 7386d1506e7SBartosz Markowski .ldpc = WMI_VDEV_PARAM_LDPC, 7396d1506e7SBartosz Markowski .tx_stbc = WMI_VDEV_PARAM_TX_STBC, 7406d1506e7SBartosz Markowski .rx_stbc = WMI_VDEV_PARAM_RX_STBC, 7416d1506e7SBartosz Markowski .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD, 7426d1506e7SBartosz Markowski .def_keyid = WMI_VDEV_PARAM_DEF_KEYID, 7436d1506e7SBartosz Markowski .nss = WMI_VDEV_PARAM_NSS, 7446d1506e7SBartosz Markowski .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE, 7456d1506e7SBartosz Markowski .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE, 7466d1506e7SBartosz Markowski .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE, 7476d1506e7SBartosz Markowski .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE, 7486d1506e7SBartosz Markowski .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 7496d1506e7SBartosz Markowski .ap_keepalive_min_idle_inactive_time_secs = 7506d1506e7SBartosz Markowski WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 7516d1506e7SBartosz Markowski .ap_keepalive_max_idle_inactive_time_secs = 7526d1506e7SBartosz Markowski WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 7536d1506e7SBartosz Markowski .ap_keepalive_max_unresponsive_time_secs = 7546d1506e7SBartosz Markowski WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 7556d1506e7SBartosz Markowski .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS, 7566d1506e7SBartosz Markowski .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED, 7576d1506e7SBartosz Markowski .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS, 7586d1506e7SBartosz Markowski .txbf = WMI_VDEV_PARAM_TXBF, 7596d1506e7SBartosz Markowski .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE, 7606d1506e7SBartosz Markowski .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY, 7616d1506e7SBartosz Markowski .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE, 7626d1506e7SBartosz Markowski .ap_detect_out_of_sync_sleeping_sta_time_secs = 7636d1506e7SBartosz Markowski WMI_VDEV_PARAM_UNSUPPORTED, 76493841a15SRaja Mani .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 76593841a15SRaja Mani .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 76693841a15SRaja Mani .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 76793841a15SRaja Mani .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 76893841a15SRaja Mani .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 76993841a15SRaja Mani .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 77093841a15SRaja Mani .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 77193841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 77293841a15SRaja Mani .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 77393841a15SRaja Mani .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 77493841a15SRaja Mani .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 77593841a15SRaja Mani .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 77693841a15SRaja Mani .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 77793841a15SRaja Mani .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 77893841a15SRaja Mani .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 77993841a15SRaja Mani .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 7806d1506e7SBartosz Markowski }; 7816d1506e7SBartosz Markowski 7826d1506e7SBartosz Markowski /* 10.X WMI VDEV param map */ 7836d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_10x_vdev_param_map = { 7846d1506e7SBartosz Markowski .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD, 7856d1506e7SBartosz Markowski .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 7866d1506e7SBartosz Markowski .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL, 7876d1506e7SBartosz Markowski .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL, 7886d1506e7SBartosz Markowski .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE, 7896d1506e7SBartosz Markowski .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE, 7906d1506e7SBartosz Markowski .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME, 7916d1506e7SBartosz Markowski .preamble = WMI_10X_VDEV_PARAM_PREAMBLE, 7926d1506e7SBartosz Markowski .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME, 7936d1506e7SBartosz Markowski .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD, 7946d1506e7SBartosz Markowski .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME, 7956d1506e7SBartosz Markowski .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL, 7966d1506e7SBartosz Markowski .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD, 7976d1506e7SBartosz Markowski .wmi_vdev_oc_scheduler_air_time_limit = 7986d1506e7SBartosz Markowski WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 7996d1506e7SBartosz Markowski .wds = WMI_10X_VDEV_PARAM_WDS, 8006d1506e7SBartosz Markowski .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW, 8016d1506e7SBartosz Markowski .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX, 8026d1506e7SBartosz Markowski .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 8036d1506e7SBartosz Markowski .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 8046d1506e7SBartosz Markowski .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM, 8056d1506e7SBartosz Markowski .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH, 8066d1506e7SBartosz Markowski .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET, 8076d1506e7SBartosz Markowski .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION, 8086d1506e7SBartosz Markowski .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT, 8096d1506e7SBartosz Markowski .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE, 8106d1506e7SBartosz Markowski .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE, 8116d1506e7SBartosz Markowski .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE, 8126d1506e7SBartosz Markowski .sgi = WMI_10X_VDEV_PARAM_SGI, 8136d1506e7SBartosz Markowski .ldpc = WMI_10X_VDEV_PARAM_LDPC, 8146d1506e7SBartosz Markowski .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC, 8156d1506e7SBartosz Markowski .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC, 8166d1506e7SBartosz Markowski .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD, 8176d1506e7SBartosz Markowski .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID, 8186d1506e7SBartosz Markowski .nss = WMI_10X_VDEV_PARAM_NSS, 8196d1506e7SBartosz Markowski .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE, 8206d1506e7SBartosz Markowski .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE, 8216d1506e7SBartosz Markowski .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE, 8226d1506e7SBartosz Markowski .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE, 8236d1506e7SBartosz Markowski .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 8246d1506e7SBartosz Markowski .ap_keepalive_min_idle_inactive_time_secs = 8256d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 8266d1506e7SBartosz Markowski .ap_keepalive_max_idle_inactive_time_secs = 8276d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 8286d1506e7SBartosz Markowski .ap_keepalive_max_unresponsive_time_secs = 8296d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 8306d1506e7SBartosz Markowski .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS, 8316d1506e7SBartosz Markowski .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET, 8326d1506e7SBartosz Markowski .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS, 8336d1506e7SBartosz Markowski .txbf = WMI_VDEV_PARAM_UNSUPPORTED, 8346d1506e7SBartosz Markowski .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED, 8356d1506e7SBartosz Markowski .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED, 8366d1506e7SBartosz Markowski .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED, 8376d1506e7SBartosz Markowski .ap_detect_out_of_sync_sleeping_sta_time_secs = 8386d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 83993841a15SRaja Mani .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 84093841a15SRaja Mani .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 84193841a15SRaja Mani .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 84293841a15SRaja Mani .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 84393841a15SRaja Mani .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 84493841a15SRaja Mani .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 84593841a15SRaja Mani .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 84693841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 84793841a15SRaja Mani .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 84893841a15SRaja Mani .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 84993841a15SRaja Mani .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 85093841a15SRaja Mani .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 85193841a15SRaja Mani .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 85293841a15SRaja Mani .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 85393841a15SRaja Mani .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 85493841a15SRaja Mani .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 8556d1506e7SBartosz Markowski }; 8566d1506e7SBartosz Markowski 8574a16fbecSRajkumar Manoharan static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = { 8584a16fbecSRajkumar Manoharan .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD, 8594a16fbecSRajkumar Manoharan .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 8604a16fbecSRajkumar Manoharan .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL, 8614a16fbecSRajkumar Manoharan .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL, 8624a16fbecSRajkumar Manoharan .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE, 8634a16fbecSRajkumar Manoharan .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE, 8644a16fbecSRajkumar Manoharan .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME, 8654a16fbecSRajkumar Manoharan .preamble = WMI_10X_VDEV_PARAM_PREAMBLE, 8664a16fbecSRajkumar Manoharan .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME, 8674a16fbecSRajkumar Manoharan .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD, 8684a16fbecSRajkumar Manoharan .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME, 8694a16fbecSRajkumar Manoharan .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL, 8704a16fbecSRajkumar Manoharan .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD, 8714a16fbecSRajkumar Manoharan .wmi_vdev_oc_scheduler_air_time_limit = 8724a16fbecSRajkumar Manoharan WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 8734a16fbecSRajkumar Manoharan .wds = WMI_10X_VDEV_PARAM_WDS, 8744a16fbecSRajkumar Manoharan .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW, 8754a16fbecSRajkumar Manoharan .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX, 8764a16fbecSRajkumar Manoharan .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 8774a16fbecSRajkumar Manoharan .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 8784a16fbecSRajkumar Manoharan .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM, 8794a16fbecSRajkumar Manoharan .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH, 8804a16fbecSRajkumar Manoharan .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET, 8814a16fbecSRajkumar Manoharan .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION, 8824a16fbecSRajkumar Manoharan .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT, 8834a16fbecSRajkumar Manoharan .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE, 8844a16fbecSRajkumar Manoharan .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE, 8854a16fbecSRajkumar Manoharan .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE, 8864a16fbecSRajkumar Manoharan .sgi = WMI_10X_VDEV_PARAM_SGI, 8874a16fbecSRajkumar Manoharan .ldpc = WMI_10X_VDEV_PARAM_LDPC, 8884a16fbecSRajkumar Manoharan .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC, 8894a16fbecSRajkumar Manoharan .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC, 8904a16fbecSRajkumar Manoharan .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD, 8914a16fbecSRajkumar Manoharan .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID, 8924a16fbecSRajkumar Manoharan .nss = WMI_10X_VDEV_PARAM_NSS, 8934a16fbecSRajkumar Manoharan .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE, 8944a16fbecSRajkumar Manoharan .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE, 8954a16fbecSRajkumar Manoharan .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE, 8964a16fbecSRajkumar Manoharan .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE, 8974a16fbecSRajkumar Manoharan .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 8984a16fbecSRajkumar Manoharan .ap_keepalive_min_idle_inactive_time_secs = 8994a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 9004a16fbecSRajkumar Manoharan .ap_keepalive_max_idle_inactive_time_secs = 9014a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 9024a16fbecSRajkumar Manoharan .ap_keepalive_max_unresponsive_time_secs = 9034a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 9044a16fbecSRajkumar Manoharan .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS, 9054a16fbecSRajkumar Manoharan .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET, 9064a16fbecSRajkumar Manoharan .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS, 9074a16fbecSRajkumar Manoharan .txbf = WMI_VDEV_PARAM_UNSUPPORTED, 9084a16fbecSRajkumar Manoharan .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED, 9094a16fbecSRajkumar Manoharan .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED, 9104a16fbecSRajkumar Manoharan .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED, 9114a16fbecSRajkumar Manoharan .ap_detect_out_of_sync_sleeping_sta_time_secs = 9124a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 91393841a15SRaja Mani .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 91493841a15SRaja Mani .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 91593841a15SRaja Mani .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 91693841a15SRaja Mani .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 91793841a15SRaja Mani .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 91893841a15SRaja Mani .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 91993841a15SRaja Mani .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 92093841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 92193841a15SRaja Mani .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 92293841a15SRaja Mani .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 92393841a15SRaja Mani .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 92493841a15SRaja Mani .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 92593841a15SRaja Mani .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 92693841a15SRaja Mani .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 92793841a15SRaja Mani .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 92893841a15SRaja Mani .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 92993841a15SRaja Mani }; 93093841a15SRaja Mani 93193841a15SRaja Mani static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = { 93293841a15SRaja Mani .rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD, 93393841a15SRaja Mani .fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 93493841a15SRaja Mani .beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL, 93593841a15SRaja Mani .listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL, 93693841a15SRaja Mani .multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE, 93793841a15SRaja Mani .mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE, 93893841a15SRaja Mani .slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME, 93993841a15SRaja Mani .preamble = WMI_10_4_VDEV_PARAM_PREAMBLE, 94093841a15SRaja Mani .swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME, 94193841a15SRaja Mani .wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD, 94293841a15SRaja Mani .wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME, 94393841a15SRaja Mani .wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL, 94493841a15SRaja Mani .dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD, 94593841a15SRaja Mani .wmi_vdev_oc_scheduler_air_time_limit = 94693841a15SRaja Mani WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 94793841a15SRaja Mani .wds = WMI_10_4_VDEV_PARAM_WDS, 94893841a15SRaja Mani .atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW, 94993841a15SRaja Mani .bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX, 95093841a15SRaja Mani .bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT, 95193841a15SRaja Mani .bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT, 95293841a15SRaja Mani .feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM, 95393841a15SRaja Mani .chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH, 95493841a15SRaja Mani .chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET, 95593841a15SRaja Mani .disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION, 95693841a15SRaja Mani .sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT, 95793841a15SRaja Mani .mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE, 95893841a15SRaja Mani .protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE, 95993841a15SRaja Mani .fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE, 96093841a15SRaja Mani .sgi = WMI_10_4_VDEV_PARAM_SGI, 96193841a15SRaja Mani .ldpc = WMI_10_4_VDEV_PARAM_LDPC, 96293841a15SRaja Mani .tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC, 96393841a15SRaja Mani .rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC, 96493841a15SRaja Mani .intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD, 96593841a15SRaja Mani .def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID, 96693841a15SRaja Mani .nss = WMI_10_4_VDEV_PARAM_NSS, 96793841a15SRaja Mani .bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE, 96893841a15SRaja Mani .mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE, 96993841a15SRaja Mani .mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE, 97093841a15SRaja Mani .dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE, 97193841a15SRaja Mani .unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 97293841a15SRaja Mani .ap_keepalive_min_idle_inactive_time_secs = 97393841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 97493841a15SRaja Mani .ap_keepalive_max_idle_inactive_time_secs = 97593841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 97693841a15SRaja Mani .ap_keepalive_max_unresponsive_time_secs = 97793841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 97893841a15SRaja Mani .ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS, 97993841a15SRaja Mani .mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET, 98093841a15SRaja Mani .enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS, 98193841a15SRaja Mani .txbf = WMI_10_4_VDEV_PARAM_TXBF, 98293841a15SRaja Mani .packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE, 98393841a15SRaja Mani .drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY, 98493841a15SRaja Mani .tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE, 98593841a15SRaja Mani .ap_detect_out_of_sync_sleeping_sta_time_secs = 98693841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 98793841a15SRaja Mani .rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES, 98893841a15SRaja Mani .cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR, 98993841a15SRaja Mani .mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET, 99093841a15SRaja Mani .rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE, 99193841a15SRaja Mani .vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK, 99293841a15SRaja Mani .vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK, 99393841a15SRaja Mani .early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE, 99493841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM, 99593841a15SRaja Mani .early_rx_bmiss_sample_cycle = 99693841a15SRaja Mani WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE, 99793841a15SRaja Mani .early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP, 99893841a15SRaja Mani .early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP, 99993841a15SRaja Mani .early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE, 100093841a15SRaja Mani .proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA, 100193841a15SRaja Mani .meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC, 100293841a15SRaja Mani .rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE, 100393841a15SRaja Mani .bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK, 10044a16fbecSRajkumar Manoharan }; 10054a16fbecSRajkumar Manoharan 1006226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_pdev_param_map = { 1007226a339bSBartosz Markowski .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK, 1008226a339bSBartosz Markowski .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK, 1009226a339bSBartosz Markowski .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G, 1010226a339bSBartosz Markowski .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G, 1011226a339bSBartosz Markowski .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE, 1012226a339bSBartosz Markowski .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE, 1013226a339bSBartosz Markowski .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE, 1014226a339bSBartosz Markowski .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1015226a339bSBartosz Markowski .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE, 1016226a339bSBartosz Markowski .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW, 1017226a339bSBartosz Markowski .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1018226a339bSBartosz Markowski .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH, 1019226a339bSBartosz Markowski .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH, 1020226a339bSBartosz Markowski .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1021226a339bSBartosz Markowski .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE, 1022226a339bSBartosz Markowski .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE, 1023226a339bSBartosz Markowski .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK, 1024226a339bSBartosz Markowski .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI, 1025226a339bSBartosz Markowski .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO, 1026226a339bSBartosz Markowski .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1027226a339bSBartosz Markowski .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1028226a339bSBartosz Markowski .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE, 1029226a339bSBartosz Markowski .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1030226a339bSBartosz Markowski .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE, 1031226a339bSBartosz Markowski .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE, 1032226a339bSBartosz Markowski .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH, 1033226a339bSBartosz Markowski .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1034226a339bSBartosz Markowski .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1035226a339bSBartosz Markowski .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE, 1036226a339bSBartosz Markowski .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1037226a339bSBartosz Markowski .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1038226a339bSBartosz Markowski .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1039226a339bSBartosz Markowski .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1040226a339bSBartosz Markowski .pmf_qos = WMI_PDEV_PARAM_PMF_QOS, 1041226a339bSBartosz Markowski .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 1042226a339bSBartosz Markowski .dcs = WMI_PDEV_PARAM_DCS, 1043226a339bSBartosz Markowski .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE, 1044226a339bSBartosz Markowski .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD, 1045226a339bSBartosz Markowski .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD, 1046226a339bSBartosz Markowski .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL, 1047226a339bSBartosz Markowski .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL, 1048226a339bSBartosz Markowski .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN, 1049226a339bSBartosz Markowski .proxy_sta = WMI_PDEV_PARAM_PROXY_STA, 1050226a339bSBartosz Markowski .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG, 1051226a339bSBartosz Markowski .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP, 1052226a339bSBartosz Markowski .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED, 1053226a339bSBartosz Markowski .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED, 1054226a339bSBartosz Markowski .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1055a7bd3e99SPeter Oh .cal_period = WMI_PDEV_PARAM_UNSUPPORTED, 1056226a339bSBartosz Markowski }; 1057226a339bSBartosz Markowski 1058226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_10x_pdev_param_map = { 1059226a339bSBartosz Markowski .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK, 1060226a339bSBartosz Markowski .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK, 1061226a339bSBartosz Markowski .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G, 1062226a339bSBartosz Markowski .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G, 1063226a339bSBartosz Markowski .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE, 1064226a339bSBartosz Markowski .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE, 1065226a339bSBartosz Markowski .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE, 1066226a339bSBartosz Markowski .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1067226a339bSBartosz Markowski .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE, 1068226a339bSBartosz Markowski .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW, 1069226a339bSBartosz Markowski .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1070226a339bSBartosz Markowski .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, 1071226a339bSBartosz Markowski .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH, 1072226a339bSBartosz Markowski .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1073226a339bSBartosz Markowski .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE, 1074226a339bSBartosz Markowski .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE, 1075226a339bSBartosz Markowski .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK, 1076226a339bSBartosz Markowski .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI, 1077226a339bSBartosz Markowski .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO, 1078226a339bSBartosz Markowski .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1079226a339bSBartosz Markowski .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1080226a339bSBartosz Markowski .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE, 1081226a339bSBartosz Markowski .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1082226a339bSBartosz Markowski .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE, 1083226a339bSBartosz Markowski .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE, 1084226a339bSBartosz Markowski .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED, 1085226a339bSBartosz Markowski .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED, 1086226a339bSBartosz Markowski .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED, 1087226a339bSBartosz Markowski .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED, 1088226a339bSBartosz Markowski .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1089226a339bSBartosz Markowski .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1090226a339bSBartosz Markowski .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1091226a339bSBartosz Markowski .bcnflt_stats_update_period = 1092226a339bSBartosz Markowski WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1093226a339bSBartosz Markowski .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS, 1094ab6258edSMarek Puzyniak .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE, 1095226a339bSBartosz Markowski .dcs = WMI_10X_PDEV_PARAM_DCS, 1096226a339bSBartosz Markowski .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE, 1097226a339bSBartosz Markowski .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD, 1098226a339bSBartosz Markowski .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD, 1099226a339bSBartosz Markowski .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL, 1100226a339bSBartosz Markowski .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL, 1101226a339bSBartosz Markowski .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN, 1102226a339bSBartosz Markowski .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED, 1103226a339bSBartosz Markowski .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED, 1104226a339bSBartosz Markowski .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED, 1105226a339bSBartosz Markowski .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, 1106226a339bSBartosz Markowski .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, 1107226a339bSBartosz Markowski .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, 1108a7bd3e99SPeter Oh .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD, 1109226a339bSBartosz Markowski }; 1110226a339bSBartosz Markowski 11114a16fbecSRajkumar Manoharan static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = { 11124a16fbecSRajkumar Manoharan .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK, 11134a16fbecSRajkumar Manoharan .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK, 11144a16fbecSRajkumar Manoharan .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G, 11154a16fbecSRajkumar Manoharan .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G, 11164a16fbecSRajkumar Manoharan .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE, 11174a16fbecSRajkumar Manoharan .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE, 11184a16fbecSRajkumar Manoharan .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE, 11194a16fbecSRajkumar Manoharan .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 11204a16fbecSRajkumar Manoharan .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE, 11214a16fbecSRajkumar Manoharan .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW, 11224a16fbecSRajkumar Manoharan .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 11234a16fbecSRajkumar Manoharan .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, 11244a16fbecSRajkumar Manoharan .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH, 11254a16fbecSRajkumar Manoharan .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING, 11264a16fbecSRajkumar Manoharan .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE, 11274a16fbecSRajkumar Manoharan .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE, 11284a16fbecSRajkumar Manoharan .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK, 11294a16fbecSRajkumar Manoharan .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI, 11304a16fbecSRajkumar Manoharan .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO, 11314a16fbecSRajkumar Manoharan .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 11324a16fbecSRajkumar Manoharan .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 11334a16fbecSRajkumar Manoharan .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE, 11344a16fbecSRajkumar Manoharan .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 11354a16fbecSRajkumar Manoharan .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE, 11364a16fbecSRajkumar Manoharan .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE, 11374a16fbecSRajkumar Manoharan .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED, 11384a16fbecSRajkumar Manoharan .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED, 11394a16fbecSRajkumar Manoharan .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED, 11404a16fbecSRajkumar Manoharan .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED, 11414a16fbecSRajkumar Manoharan .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 11424a16fbecSRajkumar Manoharan .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 11434a16fbecSRajkumar Manoharan .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 11444a16fbecSRajkumar Manoharan .bcnflt_stats_update_period = 11454a16fbecSRajkumar Manoharan WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 11464a16fbecSRajkumar Manoharan .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS, 11474a16fbecSRajkumar Manoharan .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE, 11484a16fbecSRajkumar Manoharan .dcs = WMI_10X_PDEV_PARAM_DCS, 11494a16fbecSRajkumar Manoharan .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE, 11504a16fbecSRajkumar Manoharan .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD, 11514a16fbecSRajkumar Manoharan .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD, 11524a16fbecSRajkumar Manoharan .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL, 11534a16fbecSRajkumar Manoharan .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL, 11544a16fbecSRajkumar Manoharan .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN, 11554a16fbecSRajkumar Manoharan .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED, 11564a16fbecSRajkumar Manoharan .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED, 11574a16fbecSRajkumar Manoharan .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED, 11584a16fbecSRajkumar Manoharan .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, 11594a16fbecSRajkumar Manoharan .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, 11604a16fbecSRajkumar Manoharan .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, 11614a16fbecSRajkumar Manoharan .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD, 11624a16fbecSRajkumar Manoharan }; 11634a16fbecSRajkumar Manoharan 116424c88f78SMichal Kazior /* firmware 10.2 specific mappings */ 116524c88f78SMichal Kazior static struct wmi_cmd_map wmi_10_2_cmd_map = { 116624c88f78SMichal Kazior .init_cmdid = WMI_10_2_INIT_CMDID, 116724c88f78SMichal Kazior .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID, 116824c88f78SMichal Kazior .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID, 116924c88f78SMichal Kazior .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID, 117024c88f78SMichal Kazior .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 117124c88f78SMichal Kazior .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID, 117224c88f78SMichal Kazior .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID, 117324c88f78SMichal Kazior .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID, 117424c88f78SMichal Kazior .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID, 117524c88f78SMichal Kazior .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID, 117624c88f78SMichal Kazior .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID, 117724c88f78SMichal Kazior .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID, 117824c88f78SMichal Kazior .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID, 117924c88f78SMichal Kazior .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID, 118024c88f78SMichal Kazior .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID, 118124c88f78SMichal Kazior .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID, 118224c88f78SMichal Kazior .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID, 118324c88f78SMichal Kazior .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID, 118424c88f78SMichal Kazior .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID, 118524c88f78SMichal Kazior .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID, 118624c88f78SMichal Kazior .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID, 118724c88f78SMichal Kazior .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID, 118824c88f78SMichal Kazior .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID, 118924c88f78SMichal Kazior .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID, 119024c88f78SMichal Kazior .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID, 119124c88f78SMichal Kazior .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID, 119224c88f78SMichal Kazior .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID, 119324c88f78SMichal Kazior .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID, 119424c88f78SMichal Kazior .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID, 119524c88f78SMichal Kazior .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID, 119624c88f78SMichal Kazior .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID, 119724c88f78SMichal Kazior .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID, 119824c88f78SMichal Kazior .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID, 119924c88f78SMichal Kazior .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID, 120024c88f78SMichal Kazior .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID, 120124c88f78SMichal Kazior .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID, 120224c88f78SMichal Kazior .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 120324c88f78SMichal Kazior .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID, 120424c88f78SMichal Kazior .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID, 120524c88f78SMichal Kazior .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID, 120624c88f78SMichal Kazior .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 120724c88f78SMichal Kazior .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID, 120824c88f78SMichal Kazior .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID, 120924c88f78SMichal Kazior .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID, 121024c88f78SMichal Kazior .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID, 121124c88f78SMichal Kazior .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID, 121224c88f78SMichal Kazior .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID, 121324c88f78SMichal Kazior .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID, 121424c88f78SMichal Kazior .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID, 121524c88f78SMichal Kazior .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID, 121624c88f78SMichal Kazior .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID, 121724c88f78SMichal Kazior .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID, 121824c88f78SMichal Kazior .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE, 121924c88f78SMichal Kazior .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD, 122024c88f78SMichal Kazior .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD, 122124c88f78SMichal Kazior .roam_scan_rssi_change_threshold = 122224c88f78SMichal Kazior WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 122324c88f78SMichal Kazior .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE, 122424c88f78SMichal Kazior .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE, 122524c88f78SMichal Kazior .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE, 122624c88f78SMichal Kazior .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD, 122724c88f78SMichal Kazior .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO, 122824c88f78SMichal Kazior .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY, 122924c88f78SMichal Kazior .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE, 123024c88f78SMichal Kazior .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE, 123124c88f78SMichal Kazior .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 123224c88f78SMichal Kazior .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID, 123324c88f78SMichal Kazior .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 123424c88f78SMichal Kazior .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID, 123524c88f78SMichal Kazior .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID, 123624c88f78SMichal Kazior .wlan_profile_set_hist_intvl_cmdid = 123724c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 123824c88f78SMichal Kazior .wlan_profile_get_profile_data_cmdid = 123924c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 124024c88f78SMichal Kazior .wlan_profile_enable_profile_id_cmdid = 124124c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 124224c88f78SMichal Kazior .wlan_profile_list_profile_id_cmdid = 124324c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 124424c88f78SMichal Kazior .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID, 124524c88f78SMichal Kazior .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID, 124624c88f78SMichal Kazior .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID, 124724c88f78SMichal Kazior .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID, 124824c88f78SMichal Kazior .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID, 124924c88f78SMichal Kazior .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID, 125024c88f78SMichal Kazior .wow_enable_disable_wake_event_cmdid = 125124c88f78SMichal Kazior WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 125224c88f78SMichal Kazior .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID, 125324c88f78SMichal Kazior .wow_hostwakeup_from_sleep_cmdid = 125424c88f78SMichal Kazior WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 125524c88f78SMichal Kazior .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID, 125624c88f78SMichal Kazior .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID, 125724c88f78SMichal Kazior .vdev_spectral_scan_configure_cmdid = 125824c88f78SMichal Kazior WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 125924c88f78SMichal Kazior .vdev_spectral_scan_enable_cmdid = 126024c88f78SMichal Kazior WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 126124c88f78SMichal Kazior .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID, 126224c88f78SMichal Kazior .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 126324c88f78SMichal Kazior .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 126424c88f78SMichal Kazior .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 126524c88f78SMichal Kazior .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 126624c88f78SMichal Kazior .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 126724c88f78SMichal Kazior .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 126824c88f78SMichal Kazior .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 126924c88f78SMichal Kazior .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 127024c88f78SMichal Kazior .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 127124c88f78SMichal Kazior .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 127224c88f78SMichal Kazior .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 127324c88f78SMichal Kazior .echo_cmdid = WMI_10_2_ECHO_CMDID, 127424c88f78SMichal Kazior .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID, 127524c88f78SMichal Kazior .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID, 127624c88f78SMichal Kazior .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID, 127724c88f78SMichal Kazior .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 127824c88f78SMichal Kazior .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 127924c88f78SMichal Kazior .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 128024c88f78SMichal Kazior .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 128124c88f78SMichal Kazior .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, 128224c88f78SMichal Kazior .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, 1283a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 1284772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 1285772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 1286772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 1287772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 1288772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 1289772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 1290772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 1291772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 1292772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 1293772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 1294772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 1295772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 1296772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 1297772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 1298772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 1299772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 1300772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 1301772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 1302772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 1303772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 1304772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 1305772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 1306772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 1307772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 1308772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 1309772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 1310772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 1311772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 1312772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 1313772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 1314772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 1315772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 131624c88f78SMichal Kazior }; 131724c88f78SMichal Kazior 13180226d602SMichal Kazior void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch, 13192d66721cSMichal Kazior const struct wmi_channel_arg *arg) 13202d66721cSMichal Kazior { 13212d66721cSMichal Kazior u32 flags = 0; 13222d66721cSMichal Kazior 13232d66721cSMichal Kazior memset(ch, 0, sizeof(*ch)); 13242d66721cSMichal Kazior 13252d66721cSMichal Kazior if (arg->passive) 13262d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_PASSIVE; 13272d66721cSMichal Kazior if (arg->allow_ibss) 13282d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED; 13292d66721cSMichal Kazior if (arg->allow_ht) 13302d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_ALLOW_HT; 13312d66721cSMichal Kazior if (arg->allow_vht) 13322d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_ALLOW_VHT; 13332d66721cSMichal Kazior if (arg->ht40plus) 13342d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_HT40_PLUS; 13352d66721cSMichal Kazior if (arg->chan_radar) 13362d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_DFS; 13372d66721cSMichal Kazior 13382d66721cSMichal Kazior ch->mhz = __cpu_to_le32(arg->freq); 13392d66721cSMichal Kazior ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1); 13402d66721cSMichal Kazior ch->band_center_freq2 = 0; 13412d66721cSMichal Kazior ch->min_power = arg->min_power; 13422d66721cSMichal Kazior ch->max_power = arg->max_power; 13432d66721cSMichal Kazior ch->reg_power = arg->max_reg_power; 13442d66721cSMichal Kazior ch->antenna_max = arg->max_antenna_gain; 13452d66721cSMichal Kazior 13462d66721cSMichal Kazior /* mode & flags share storage */ 13472d66721cSMichal Kazior ch->mode = arg->mode; 13482d66721cSMichal Kazior ch->flags |= __cpu_to_le32(flags); 13492d66721cSMichal Kazior } 13502d66721cSMichal Kazior 13515e3dd157SKalle Valo int ath10k_wmi_wait_for_service_ready(struct ath10k *ar) 13525e3dd157SKalle Valo { 13539eea5689SNicholas Mc Guire unsigned long time_left; 1354af762c0bSKalle Valo 13559eea5689SNicholas Mc Guire time_left = wait_for_completion_timeout(&ar->wmi.service_ready, 13565e3dd157SKalle Valo WMI_SERVICE_READY_TIMEOUT_HZ); 13579eea5689SNicholas Mc Guire if (!time_left) 13589eea5689SNicholas Mc Guire return -ETIMEDOUT; 13599eea5689SNicholas Mc Guire return 0; 13605e3dd157SKalle Valo } 13615e3dd157SKalle Valo 13625e3dd157SKalle Valo int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar) 13635e3dd157SKalle Valo { 13649eea5689SNicholas Mc Guire unsigned long time_left; 1365af762c0bSKalle Valo 13669eea5689SNicholas Mc Guire time_left = wait_for_completion_timeout(&ar->wmi.unified_ready, 13675e3dd157SKalle Valo WMI_UNIFIED_READY_TIMEOUT_HZ); 13689eea5689SNicholas Mc Guire if (!time_left) 13699eea5689SNicholas Mc Guire return -ETIMEDOUT; 13709eea5689SNicholas Mc Guire return 0; 13715e3dd157SKalle Valo } 13725e3dd157SKalle Valo 1373666a73f3SKalle Valo struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len) 13745e3dd157SKalle Valo { 13755e3dd157SKalle Valo struct sk_buff *skb; 13765e3dd157SKalle Valo u32 round_len = roundup(len, 4); 13775e3dd157SKalle Valo 13787aa7a72aSMichal Kazior skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len); 13795e3dd157SKalle Valo if (!skb) 13805e3dd157SKalle Valo return NULL; 13815e3dd157SKalle Valo 13825e3dd157SKalle Valo skb_reserve(skb, WMI_SKB_HEADROOM); 13835e3dd157SKalle Valo if (!IS_ALIGNED((unsigned long)skb->data, 4)) 13847aa7a72aSMichal Kazior ath10k_warn(ar, "Unaligned WMI skb\n"); 13855e3dd157SKalle Valo 13865e3dd157SKalle Valo skb_put(skb, round_len); 13875e3dd157SKalle Valo memset(skb->data, 0, round_len); 13885e3dd157SKalle Valo 13895e3dd157SKalle Valo return skb; 13905e3dd157SKalle Valo } 13915e3dd157SKalle Valo 13925e3dd157SKalle Valo static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb) 13935e3dd157SKalle Valo { 13945e3dd157SKalle Valo dev_kfree_skb(skb); 13955e3dd157SKalle Valo } 13965e3dd157SKalle Valo 1397d7579d12SMichal Kazior int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb, 1398ce42870eSBartosz Markowski u32 cmd_id) 13995e3dd157SKalle Valo { 14005e3dd157SKalle Valo struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); 14015e3dd157SKalle Valo struct wmi_cmd_hdr *cmd_hdr; 1402be8b3943SMichal Kazior int ret; 14035e3dd157SKalle Valo u32 cmd = 0; 14045e3dd157SKalle Valo 14055e3dd157SKalle Valo if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 14065e3dd157SKalle Valo return -ENOMEM; 14075e3dd157SKalle Valo 14085e3dd157SKalle Valo cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID); 14095e3dd157SKalle Valo 14105e3dd157SKalle Valo cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 14115e3dd157SKalle Valo cmd_hdr->cmd_id = __cpu_to_le32(cmd); 14125e3dd157SKalle Valo 14135e3dd157SKalle Valo memset(skb_cb, 0, sizeof(*skb_cb)); 1414be8b3943SMichal Kazior ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb); 1415d35a6c18SMichal Kazior trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len, ret); 14165e3dd157SKalle Valo 1417be8b3943SMichal Kazior if (ret) 1418be8b3943SMichal Kazior goto err_pull; 14195e3dd157SKalle Valo 14205e3dd157SKalle Valo return 0; 1421be8b3943SMichal Kazior 1422be8b3943SMichal Kazior err_pull: 1423be8b3943SMichal Kazior skb_pull(skb, sizeof(struct wmi_cmd_hdr)); 1424be8b3943SMichal Kazior return ret; 1425be8b3943SMichal Kazior } 1426be8b3943SMichal Kazior 1427ed54388aSMichal Kazior static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif) 1428ed54388aSMichal Kazior { 1429af21319fSMichal Kazior struct ath10k *ar = arvif->ar; 14309ad50182SMichal Kazior struct ath10k_skb_cb *cb; 1431af21319fSMichal Kazior struct sk_buff *bcn; 1432ed54388aSMichal Kazior int ret; 1433ed54388aSMichal Kazior 1434af21319fSMichal Kazior spin_lock_bh(&ar->data_lock); 1435ed54388aSMichal Kazior 14369ad50182SMichal Kazior bcn = arvif->beacon; 1437ed54388aSMichal Kazior 1438af21319fSMichal Kazior if (!bcn) 1439af21319fSMichal Kazior goto unlock; 1440ed54388aSMichal Kazior 14419ad50182SMichal Kazior cb = ATH10K_SKB_CB(bcn); 1442ed54388aSMichal Kazior 1443af21319fSMichal Kazior switch (arvif->beacon_state) { 1444af21319fSMichal Kazior case ATH10K_BEACON_SENDING: 1445af21319fSMichal Kazior case ATH10K_BEACON_SENT: 1446af21319fSMichal Kazior break; 1447af21319fSMichal Kazior case ATH10K_BEACON_SCHEDULED: 1448af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SENDING; 1449af21319fSMichal Kazior spin_unlock_bh(&ar->data_lock); 1450af21319fSMichal Kazior 1451af21319fSMichal Kazior ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar, 1452af21319fSMichal Kazior arvif->vdev_id, 1453af21319fSMichal Kazior bcn->data, bcn->len, 1454af21319fSMichal Kazior cb->paddr, 14559ad50182SMichal Kazior cb->bcn.dtim_zero, 14569ad50182SMichal Kazior cb->bcn.deliver_cab); 1457ed54388aSMichal Kazior 1458af21319fSMichal Kazior spin_lock_bh(&ar->data_lock); 1459af21319fSMichal Kazior 1460af21319fSMichal Kazior if (ret == 0) 1461af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SENT; 1462af21319fSMichal Kazior else 1463af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SCHEDULED; 1464af21319fSMichal Kazior } 1465af21319fSMichal Kazior 1466af21319fSMichal Kazior unlock: 1467af21319fSMichal Kazior spin_unlock_bh(&ar->data_lock); 1468ed54388aSMichal Kazior } 1469ed54388aSMichal Kazior 1470ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac, 1471ed54388aSMichal Kazior struct ieee80211_vif *vif) 1472ed54388aSMichal Kazior { 1473ed54388aSMichal Kazior struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 1474ed54388aSMichal Kazior 1475ed54388aSMichal Kazior ath10k_wmi_tx_beacon_nowait(arvif); 1476ed54388aSMichal Kazior } 1477ed54388aSMichal Kazior 1478ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar) 1479ed54388aSMichal Kazior { 1480ed54388aSMichal Kazior ieee80211_iterate_active_interfaces_atomic(ar->hw, 1481ed54388aSMichal Kazior IEEE80211_IFACE_ITER_NORMAL, 1482ed54388aSMichal Kazior ath10k_wmi_tx_beacons_iter, 1483ed54388aSMichal Kazior NULL); 1484ed54388aSMichal Kazior } 1485ed54388aSMichal Kazior 148612acbc43SMichal Kazior static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar) 1487be8b3943SMichal Kazior { 1488ed54388aSMichal Kazior /* try to send pending beacons first. they take priority */ 1489ed54388aSMichal Kazior ath10k_wmi_tx_beacons_nowait(ar); 1490ed54388aSMichal Kazior 1491be8b3943SMichal Kazior wake_up(&ar->wmi.tx_credits_wq); 1492be8b3943SMichal Kazior } 1493be8b3943SMichal Kazior 1494666a73f3SKalle Valo int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id) 1495be8b3943SMichal Kazior { 149634957b25SBartosz Markowski int ret = -EOPNOTSUPP; 1497be8b3943SMichal Kazior 149856b84287SKalle Valo might_sleep(); 149956b84287SKalle Valo 150034957b25SBartosz Markowski if (cmd_id == WMI_CMD_UNSUPPORTED) { 15017aa7a72aSMichal Kazior ath10k_warn(ar, "wmi command %d is not supported by firmware\n", 150255321559SBartosz Markowski cmd_id); 150355321559SBartosz Markowski return ret; 150455321559SBartosz Markowski } 1505be8b3943SMichal Kazior 1506be8b3943SMichal Kazior wait_event_timeout(ar->wmi.tx_credits_wq, ({ 1507ed54388aSMichal Kazior /* try to send pending beacons first. they take priority */ 1508ed54388aSMichal Kazior ath10k_wmi_tx_beacons_nowait(ar); 1509ed54388aSMichal Kazior 1510be8b3943SMichal Kazior ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id); 15117962b0d8SMichal Kazior 15127962b0d8SMichal Kazior if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) 15137962b0d8SMichal Kazior ret = -ESHUTDOWN; 15147962b0d8SMichal Kazior 1515be8b3943SMichal Kazior (ret != -EAGAIN); 1516be8b3943SMichal Kazior }), 3*HZ); 1517be8b3943SMichal Kazior 1518be8b3943SMichal Kazior if (ret) 1519be8b3943SMichal Kazior dev_kfree_skb_any(skb); 1520be8b3943SMichal Kazior 1521be8b3943SMichal Kazior return ret; 15225e3dd157SKalle Valo } 15235e3dd157SKalle Valo 1524d7579d12SMichal Kazior static struct sk_buff * 1525d7579d12SMichal Kazior ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) 15265e00d31aSBartosz Markowski { 15275e00d31aSBartosz Markowski struct wmi_mgmt_tx_cmd *cmd; 15285e00d31aSBartosz Markowski struct ieee80211_hdr *hdr; 1529d7579d12SMichal Kazior struct sk_buff *skb; 15305e00d31aSBartosz Markowski int len; 1531d7579d12SMichal Kazior u32 buf_len = msdu->len; 15325e00d31aSBartosz Markowski u16 fc; 15335e00d31aSBartosz Markowski 1534d7579d12SMichal Kazior hdr = (struct ieee80211_hdr *)msdu->data; 15355e00d31aSBartosz Markowski fc = le16_to_cpu(hdr->frame_control); 15365e00d31aSBartosz Markowski 15375e00d31aSBartosz Markowski if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control))) 1538d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 15395e00d31aSBartosz Markowski 1540d7579d12SMichal Kazior len = sizeof(cmd->hdr) + msdu->len; 1541eeab266cSMarek Kwaczynski 1542eeab266cSMarek Kwaczynski if ((ieee80211_is_action(hdr->frame_control) || 1543eeab266cSMarek Kwaczynski ieee80211_is_deauth(hdr->frame_control) || 1544eeab266cSMarek Kwaczynski ieee80211_is_disassoc(hdr->frame_control)) && 1545eeab266cSMarek Kwaczynski ieee80211_has_protected(hdr->frame_control)) { 1546eeab266cSMarek Kwaczynski len += IEEE80211_CCMP_MIC_LEN; 1547eeab266cSMarek Kwaczynski buf_len += IEEE80211_CCMP_MIC_LEN; 1548eeab266cSMarek Kwaczynski } 1549eeab266cSMarek Kwaczynski 15505e00d31aSBartosz Markowski len = round_up(len, 4); 15515e00d31aSBartosz Markowski 1552d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 1553d7579d12SMichal Kazior if (!skb) 1554d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 15555e00d31aSBartosz Markowski 1556d7579d12SMichal Kazior cmd = (struct wmi_mgmt_tx_cmd *)skb->data; 15575e00d31aSBartosz Markowski 1558d7579d12SMichal Kazior cmd->hdr.vdev_id = __cpu_to_le32(ATH10K_SKB_CB(msdu)->vdev_id); 15595e00d31aSBartosz Markowski cmd->hdr.tx_rate = 0; 15605e00d31aSBartosz Markowski cmd->hdr.tx_power = 0; 1561eeab266cSMarek Kwaczynski cmd->hdr.buf_len = __cpu_to_le32(buf_len); 15625e00d31aSBartosz Markowski 1563b25f32cbSKalle Valo ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr)); 1564d7579d12SMichal Kazior memcpy(cmd->buf, msdu->data, msdu->len); 15655e00d31aSBartosz Markowski 15667aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %p len %d ftype %02x stype %02x\n", 1567d7579d12SMichal Kazior msdu, skb->len, fc & IEEE80211_FCTL_FTYPE, 15685e00d31aSBartosz Markowski fc & IEEE80211_FCTL_STYPE); 15695ce8e7fdSRajkumar Manoharan trace_ath10k_tx_hdr(ar, skb->data, skb->len); 15705ce8e7fdSRajkumar Manoharan trace_ath10k_tx_payload(ar, skb->data, skb->len); 15715e00d31aSBartosz Markowski 1572d7579d12SMichal Kazior return skb; 15735e00d31aSBartosz Markowski } 15745e00d31aSBartosz Markowski 15755c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_started(struct ath10k *ar) 15765c81c7fdSMichal Kazior { 15775c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 15785c81c7fdSMichal Kazior 15795c81c7fdSMichal Kazior switch (ar->scan.state) { 15805c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 15815c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 15825c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 15837aa7a72aSMichal Kazior ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n", 15845c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 15855c81c7fdSMichal Kazior ar->scan.state); 15865c81c7fdSMichal Kazior break; 15875c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 15885c81c7fdSMichal Kazior ar->scan.state = ATH10K_SCAN_RUNNING; 15895c81c7fdSMichal Kazior 15905c81c7fdSMichal Kazior if (ar->scan.is_roc) 15915c81c7fdSMichal Kazior ieee80211_ready_on_channel(ar->hw); 15925c81c7fdSMichal Kazior 15935c81c7fdSMichal Kazior complete(&ar->scan.started); 15945c81c7fdSMichal Kazior break; 15955c81c7fdSMichal Kazior } 15965c81c7fdSMichal Kazior } 15975c81c7fdSMichal Kazior 15982f9eec0bSBen Greear static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar) 15992f9eec0bSBen Greear { 16002f9eec0bSBen Greear lockdep_assert_held(&ar->data_lock); 16012f9eec0bSBen Greear 16022f9eec0bSBen Greear switch (ar->scan.state) { 16032f9eec0bSBen Greear case ATH10K_SCAN_IDLE: 16042f9eec0bSBen Greear case ATH10K_SCAN_RUNNING: 16052f9eec0bSBen Greear case ATH10K_SCAN_ABORTING: 16062f9eec0bSBen Greear ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n", 16072f9eec0bSBen Greear ath10k_scan_state_str(ar->scan.state), 16082f9eec0bSBen Greear ar->scan.state); 16092f9eec0bSBen Greear break; 16102f9eec0bSBen Greear case ATH10K_SCAN_STARTING: 16112f9eec0bSBen Greear complete(&ar->scan.started); 16122f9eec0bSBen Greear __ath10k_scan_finish(ar); 16132f9eec0bSBen Greear break; 16142f9eec0bSBen Greear } 16152f9eec0bSBen Greear } 16162f9eec0bSBen Greear 16175c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_completed(struct ath10k *ar) 16185c81c7fdSMichal Kazior { 16195c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 16205c81c7fdSMichal Kazior 16215c81c7fdSMichal Kazior switch (ar->scan.state) { 16225c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 16235c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 16245c81c7fdSMichal Kazior /* One suspected reason scan can be completed while starting is 16255c81c7fdSMichal Kazior * if firmware fails to deliver all scan events to the host, 16265c81c7fdSMichal Kazior * e.g. when transport pipe is full. This has been observed 16275c81c7fdSMichal Kazior * with spectral scan phyerr events starving wmi transport 16285c81c7fdSMichal Kazior * pipe. In such case the "scan completed" event should be (and 16295c81c7fdSMichal Kazior * is) ignored by the host as it may be just firmware's scan 16305c81c7fdSMichal Kazior * state machine recovering. 16315c81c7fdSMichal Kazior */ 16327aa7a72aSMichal Kazior ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n", 16335c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 16345c81c7fdSMichal Kazior ar->scan.state); 16355c81c7fdSMichal Kazior break; 16365c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 16375c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 16385c81c7fdSMichal Kazior __ath10k_scan_finish(ar); 16395c81c7fdSMichal Kazior break; 16405c81c7fdSMichal Kazior } 16415c81c7fdSMichal Kazior } 16425c81c7fdSMichal Kazior 16435c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar) 16445c81c7fdSMichal Kazior { 16455c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 16465c81c7fdSMichal Kazior 16475c81c7fdSMichal Kazior switch (ar->scan.state) { 16485c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 16495c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 16507aa7a72aSMichal Kazior ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n", 16515c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 16525c81c7fdSMichal Kazior ar->scan.state); 16535c81c7fdSMichal Kazior break; 16545c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 16555c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 16565c81c7fdSMichal Kazior ar->scan_channel = NULL; 16575c81c7fdSMichal Kazior break; 16585c81c7fdSMichal Kazior } 16595c81c7fdSMichal Kazior } 16605c81c7fdSMichal Kazior 16615c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq) 16625c81c7fdSMichal Kazior { 16635c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 16645c81c7fdSMichal Kazior 16655c81c7fdSMichal Kazior switch (ar->scan.state) { 16665c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 16675c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 16687aa7a72aSMichal Kazior ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n", 16695c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 16705c81c7fdSMichal Kazior ar->scan.state); 16715c81c7fdSMichal Kazior break; 16725c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 16735c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 16745c81c7fdSMichal Kazior ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq); 16755c81c7fdSMichal Kazior 16765c81c7fdSMichal Kazior if (ar->scan.is_roc && ar->scan.roc_freq == freq) 16775c81c7fdSMichal Kazior complete(&ar->scan.on_channel); 16785c81c7fdSMichal Kazior break; 16795c81c7fdSMichal Kazior } 16805c81c7fdSMichal Kazior } 16815c81c7fdSMichal Kazior 16829ff8b724SMichal Kazior static const char * 16839ff8b724SMichal Kazior ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type, 16849ff8b724SMichal Kazior enum wmi_scan_completion_reason reason) 16859ff8b724SMichal Kazior { 16869ff8b724SMichal Kazior switch (type) { 16879ff8b724SMichal Kazior case WMI_SCAN_EVENT_STARTED: 16889ff8b724SMichal Kazior return "started"; 16899ff8b724SMichal Kazior case WMI_SCAN_EVENT_COMPLETED: 16909ff8b724SMichal Kazior switch (reason) { 16919ff8b724SMichal Kazior case WMI_SCAN_REASON_COMPLETED: 16929ff8b724SMichal Kazior return "completed"; 16939ff8b724SMichal Kazior case WMI_SCAN_REASON_CANCELLED: 16949ff8b724SMichal Kazior return "completed [cancelled]"; 16959ff8b724SMichal Kazior case WMI_SCAN_REASON_PREEMPTED: 16969ff8b724SMichal Kazior return "completed [preempted]"; 16979ff8b724SMichal Kazior case WMI_SCAN_REASON_TIMEDOUT: 16989ff8b724SMichal Kazior return "completed [timedout]"; 16999ff8b724SMichal Kazior case WMI_SCAN_REASON_MAX: 17009ff8b724SMichal Kazior break; 17019ff8b724SMichal Kazior } 17029ff8b724SMichal Kazior return "completed [unknown]"; 17039ff8b724SMichal Kazior case WMI_SCAN_EVENT_BSS_CHANNEL: 17049ff8b724SMichal Kazior return "bss channel"; 17059ff8b724SMichal Kazior case WMI_SCAN_EVENT_FOREIGN_CHANNEL: 17069ff8b724SMichal Kazior return "foreign channel"; 17079ff8b724SMichal Kazior case WMI_SCAN_EVENT_DEQUEUED: 17089ff8b724SMichal Kazior return "dequeued"; 17099ff8b724SMichal Kazior case WMI_SCAN_EVENT_PREEMPTED: 17109ff8b724SMichal Kazior return "preempted"; 17119ff8b724SMichal Kazior case WMI_SCAN_EVENT_START_FAILED: 17129ff8b724SMichal Kazior return "start failed"; 17139ff8b724SMichal Kazior default: 17149ff8b724SMichal Kazior return "unknown"; 17159ff8b724SMichal Kazior } 17169ff8b724SMichal Kazior } 17179ff8b724SMichal Kazior 1718d7579d12SMichal Kazior static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb, 171932653cf1SMichal Kazior struct wmi_scan_ev_arg *arg) 172032653cf1SMichal Kazior { 172132653cf1SMichal Kazior struct wmi_scan_event *ev = (void *)skb->data; 172232653cf1SMichal Kazior 172332653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 172432653cf1SMichal Kazior return -EPROTO; 172532653cf1SMichal Kazior 172632653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 172732653cf1SMichal Kazior arg->event_type = ev->event_type; 172832653cf1SMichal Kazior arg->reason = ev->reason; 172932653cf1SMichal Kazior arg->channel_freq = ev->channel_freq; 173032653cf1SMichal Kazior arg->scan_req_id = ev->scan_req_id; 173132653cf1SMichal Kazior arg->scan_id = ev->scan_id; 173232653cf1SMichal Kazior arg->vdev_id = ev->vdev_id; 173332653cf1SMichal Kazior 173432653cf1SMichal Kazior return 0; 173532653cf1SMichal Kazior } 173632653cf1SMichal Kazior 17370226d602SMichal Kazior int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb) 17385e3dd157SKalle Valo { 173932653cf1SMichal Kazior struct wmi_scan_ev_arg arg = {}; 17405e3dd157SKalle Valo enum wmi_scan_event_type event_type; 17415e3dd157SKalle Valo enum wmi_scan_completion_reason reason; 17425e3dd157SKalle Valo u32 freq; 17435e3dd157SKalle Valo u32 req_id; 17445e3dd157SKalle Valo u32 scan_id; 17455e3dd157SKalle Valo u32 vdev_id; 174632653cf1SMichal Kazior int ret; 17475e3dd157SKalle Valo 1748d7579d12SMichal Kazior ret = ath10k_wmi_pull_scan(ar, skb, &arg); 174932653cf1SMichal Kazior if (ret) { 175032653cf1SMichal Kazior ath10k_warn(ar, "failed to parse scan event: %d\n", ret); 175132653cf1SMichal Kazior return ret; 175232653cf1SMichal Kazior } 175332653cf1SMichal Kazior 175432653cf1SMichal Kazior event_type = __le32_to_cpu(arg.event_type); 175532653cf1SMichal Kazior reason = __le32_to_cpu(arg.reason); 175632653cf1SMichal Kazior freq = __le32_to_cpu(arg.channel_freq); 175732653cf1SMichal Kazior req_id = __le32_to_cpu(arg.scan_req_id); 175832653cf1SMichal Kazior scan_id = __le32_to_cpu(arg.scan_id); 175932653cf1SMichal Kazior vdev_id = __le32_to_cpu(arg.vdev_id); 17605e3dd157SKalle Valo 17615e3dd157SKalle Valo spin_lock_bh(&ar->data_lock); 17625e3dd157SKalle Valo 17637aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 17645c81c7fdSMichal Kazior "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n", 17655c81c7fdSMichal Kazior ath10k_wmi_event_scan_type_str(event_type, reason), 17665c81c7fdSMichal Kazior event_type, reason, freq, req_id, scan_id, vdev_id, 17675c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), ar->scan.state); 17685c81c7fdSMichal Kazior 17695e3dd157SKalle Valo switch (event_type) { 17705e3dd157SKalle Valo case WMI_SCAN_EVENT_STARTED: 17715c81c7fdSMichal Kazior ath10k_wmi_event_scan_started(ar); 17725e3dd157SKalle Valo break; 17735e3dd157SKalle Valo case WMI_SCAN_EVENT_COMPLETED: 17745c81c7fdSMichal Kazior ath10k_wmi_event_scan_completed(ar); 17755e3dd157SKalle Valo break; 17765e3dd157SKalle Valo case WMI_SCAN_EVENT_BSS_CHANNEL: 17775c81c7fdSMichal Kazior ath10k_wmi_event_scan_bss_chan(ar); 17785e3dd157SKalle Valo break; 17795e3dd157SKalle Valo case WMI_SCAN_EVENT_FOREIGN_CHANNEL: 17805c81c7fdSMichal Kazior ath10k_wmi_event_scan_foreign_chan(ar, freq); 17815c81c7fdSMichal Kazior break; 17825c81c7fdSMichal Kazior case WMI_SCAN_EVENT_START_FAILED: 17837aa7a72aSMichal Kazior ath10k_warn(ar, "received scan start failure event\n"); 17842f9eec0bSBen Greear ath10k_wmi_event_scan_start_failed(ar); 17855e3dd157SKalle Valo break; 17865e3dd157SKalle Valo case WMI_SCAN_EVENT_DEQUEUED: 17875e3dd157SKalle Valo case WMI_SCAN_EVENT_PREEMPTED: 17885e3dd157SKalle Valo default: 17895e3dd157SKalle Valo break; 17905e3dd157SKalle Valo } 17915e3dd157SKalle Valo 17925e3dd157SKalle Valo spin_unlock_bh(&ar->data_lock); 17935e3dd157SKalle Valo return 0; 17945e3dd157SKalle Valo } 17955e3dd157SKalle Valo 17965e3dd157SKalle Valo static inline enum ieee80211_band phy_mode_to_band(u32 phy_mode) 17975e3dd157SKalle Valo { 17985e3dd157SKalle Valo enum ieee80211_band band; 17995e3dd157SKalle Valo 18005e3dd157SKalle Valo switch (phy_mode) { 18015e3dd157SKalle Valo case MODE_11A: 18025e3dd157SKalle Valo case MODE_11NA_HT20: 18035e3dd157SKalle Valo case MODE_11NA_HT40: 18045e3dd157SKalle Valo case MODE_11AC_VHT20: 18055e3dd157SKalle Valo case MODE_11AC_VHT40: 18065e3dd157SKalle Valo case MODE_11AC_VHT80: 18075e3dd157SKalle Valo band = IEEE80211_BAND_5GHZ; 18085e3dd157SKalle Valo break; 18095e3dd157SKalle Valo case MODE_11G: 18105e3dd157SKalle Valo case MODE_11B: 18115e3dd157SKalle Valo case MODE_11GONLY: 18125e3dd157SKalle Valo case MODE_11NG_HT20: 18135e3dd157SKalle Valo case MODE_11NG_HT40: 18145e3dd157SKalle Valo case MODE_11AC_VHT20_2G: 18155e3dd157SKalle Valo case MODE_11AC_VHT40_2G: 18165e3dd157SKalle Valo case MODE_11AC_VHT80_2G: 18175e3dd157SKalle Valo default: 18185e3dd157SKalle Valo band = IEEE80211_BAND_2GHZ; 18195e3dd157SKalle Valo } 18205e3dd157SKalle Valo 18215e3dd157SKalle Valo return band; 18225e3dd157SKalle Valo } 18235e3dd157SKalle Valo 1824504f6cdfSSujith Manoharan /* If keys are configured, HW decrypts all frames 1825504f6cdfSSujith Manoharan * with protected bit set. Mark such frames as decrypted. 1826504f6cdfSSujith Manoharan */ 1827504f6cdfSSujith Manoharan static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar, 1828504f6cdfSSujith Manoharan struct sk_buff *skb, 1829504f6cdfSSujith Manoharan struct ieee80211_rx_status *status) 1830504f6cdfSSujith Manoharan { 1831504f6cdfSSujith Manoharan struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 1832504f6cdfSSujith Manoharan unsigned int hdrlen; 1833504f6cdfSSujith Manoharan bool peer_key; 1834504f6cdfSSujith Manoharan u8 *addr, keyidx; 1835504f6cdfSSujith Manoharan 1836504f6cdfSSujith Manoharan if (!ieee80211_is_auth(hdr->frame_control) || 1837504f6cdfSSujith Manoharan !ieee80211_has_protected(hdr->frame_control)) 1838504f6cdfSSujith Manoharan return; 1839504f6cdfSSujith Manoharan 1840504f6cdfSSujith Manoharan hdrlen = ieee80211_hdrlen(hdr->frame_control); 1841504f6cdfSSujith Manoharan if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN)) 1842504f6cdfSSujith Manoharan return; 1843504f6cdfSSujith Manoharan 1844504f6cdfSSujith Manoharan keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT; 1845504f6cdfSSujith Manoharan addr = ieee80211_get_SA(hdr); 1846504f6cdfSSujith Manoharan 1847504f6cdfSSujith Manoharan spin_lock_bh(&ar->data_lock); 1848504f6cdfSSujith Manoharan peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx); 1849504f6cdfSSujith Manoharan spin_unlock_bh(&ar->data_lock); 1850504f6cdfSSujith Manoharan 1851504f6cdfSSujith Manoharan if (peer_key) { 1852504f6cdfSSujith Manoharan ath10k_dbg(ar, ATH10K_DBG_MAC, 1853504f6cdfSSujith Manoharan "mac wep key present for peer %pM\n", addr); 1854504f6cdfSSujith Manoharan status->flag |= RX_FLAG_DECRYPTED; 1855504f6cdfSSujith Manoharan } 1856504f6cdfSSujith Manoharan } 1857504f6cdfSSujith Manoharan 1858d7579d12SMichal Kazior static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb, 1859d7579d12SMichal Kazior struct wmi_mgmt_rx_ev_arg *arg) 18605e3dd157SKalle Valo { 18610d9b0438SMichal Kazior struct wmi_mgmt_rx_event_v1 *ev_v1; 18620d9b0438SMichal Kazior struct wmi_mgmt_rx_event_v2 *ev_v2; 18630d9b0438SMichal Kazior struct wmi_mgmt_rx_hdr_v1 *ev_hdr; 186432653cf1SMichal Kazior size_t pull_len; 186532653cf1SMichal Kazior u32 msdu_len; 18665e3dd157SKalle Valo 18670d9b0438SMichal Kazior if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features)) { 18680d9b0438SMichal Kazior ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data; 18690d9b0438SMichal Kazior ev_hdr = &ev_v2->hdr.v1; 18700d9b0438SMichal Kazior pull_len = sizeof(*ev_v2); 18710d9b0438SMichal Kazior } else { 18720d9b0438SMichal Kazior ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data; 18730d9b0438SMichal Kazior ev_hdr = &ev_v1->hdr; 18740d9b0438SMichal Kazior pull_len = sizeof(*ev_v1); 18750d9b0438SMichal Kazior } 18760d9b0438SMichal Kazior 187732653cf1SMichal Kazior if (skb->len < pull_len) 187832653cf1SMichal Kazior return -EPROTO; 187932653cf1SMichal Kazior 188032653cf1SMichal Kazior skb_pull(skb, pull_len); 188132653cf1SMichal Kazior arg->channel = ev_hdr->channel; 188232653cf1SMichal Kazior arg->buf_len = ev_hdr->buf_len; 188332653cf1SMichal Kazior arg->status = ev_hdr->status; 188432653cf1SMichal Kazior arg->snr = ev_hdr->snr; 188532653cf1SMichal Kazior arg->phy_mode = ev_hdr->phy_mode; 188632653cf1SMichal Kazior arg->rate = ev_hdr->rate; 188732653cf1SMichal Kazior 188832653cf1SMichal Kazior msdu_len = __le32_to_cpu(arg->buf_len); 188932653cf1SMichal Kazior if (skb->len < msdu_len) 189032653cf1SMichal Kazior return -EPROTO; 189132653cf1SMichal Kazior 189232653cf1SMichal Kazior /* the WMI buffer might've ended up being padded to 4 bytes due to HTC 189332653cf1SMichal Kazior * trailer with credit update. Trim the excess garbage. 189432653cf1SMichal Kazior */ 189532653cf1SMichal Kazior skb_trim(skb, msdu_len); 189632653cf1SMichal Kazior 189732653cf1SMichal Kazior return 0; 189832653cf1SMichal Kazior } 189932653cf1SMichal Kazior 19000226d602SMichal Kazior int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb) 190132653cf1SMichal Kazior { 190232653cf1SMichal Kazior struct wmi_mgmt_rx_ev_arg arg = {}; 190332653cf1SMichal Kazior struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 190432653cf1SMichal Kazior struct ieee80211_hdr *hdr; 190501cebe1cSMichal Kazior struct ieee80211_supported_band *sband; 190632653cf1SMichal Kazior u32 rx_status; 190732653cf1SMichal Kazior u32 channel; 190832653cf1SMichal Kazior u32 phy_mode; 190932653cf1SMichal Kazior u32 snr; 191032653cf1SMichal Kazior u32 rate; 191132653cf1SMichal Kazior u32 buf_len; 191232653cf1SMichal Kazior u16 fc; 191332653cf1SMichal Kazior int ret; 191432653cf1SMichal Kazior 1915d7579d12SMichal Kazior ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg); 191632653cf1SMichal Kazior if (ret) { 191732653cf1SMichal Kazior ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret); 191808603f2eSRaja Mani dev_kfree_skb(skb); 191932653cf1SMichal Kazior return ret; 192032653cf1SMichal Kazior } 192132653cf1SMichal Kazior 192232653cf1SMichal Kazior channel = __le32_to_cpu(arg.channel); 192332653cf1SMichal Kazior buf_len = __le32_to_cpu(arg.buf_len); 192432653cf1SMichal Kazior rx_status = __le32_to_cpu(arg.status); 192532653cf1SMichal Kazior snr = __le32_to_cpu(arg.snr); 192632653cf1SMichal Kazior phy_mode = __le32_to_cpu(arg.phy_mode); 192732653cf1SMichal Kazior rate = __le32_to_cpu(arg.rate); 19285e3dd157SKalle Valo 19295e3dd157SKalle Valo memset(status, 0, sizeof(*status)); 19305e3dd157SKalle Valo 19317aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 19325e3dd157SKalle Valo "event mgmt rx status %08x\n", rx_status); 19335e3dd157SKalle Valo 1934e8a50f8bSMarek Puzyniak if (test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) { 1935e8a50f8bSMarek Puzyniak dev_kfree_skb(skb); 1936e8a50f8bSMarek Puzyniak return 0; 1937e8a50f8bSMarek Puzyniak } 1938e8a50f8bSMarek Puzyniak 19395e3dd157SKalle Valo if (rx_status & WMI_RX_STATUS_ERR_DECRYPT) { 19405e3dd157SKalle Valo dev_kfree_skb(skb); 19415e3dd157SKalle Valo return 0; 19425e3dd157SKalle Valo } 19435e3dd157SKalle Valo 19445e3dd157SKalle Valo if (rx_status & WMI_RX_STATUS_ERR_KEY_CACHE_MISS) { 19455e3dd157SKalle Valo dev_kfree_skb(skb); 19465e3dd157SKalle Valo return 0; 19475e3dd157SKalle Valo } 19485e3dd157SKalle Valo 1949d67d0a02SMichal Kazior if (rx_status & WMI_RX_STATUS_ERR_CRC) { 1950d67d0a02SMichal Kazior dev_kfree_skb(skb); 1951d67d0a02SMichal Kazior return 0; 1952d67d0a02SMichal Kazior } 1953d67d0a02SMichal Kazior 19545e3dd157SKalle Valo if (rx_status & WMI_RX_STATUS_ERR_MIC) 19555e3dd157SKalle Valo status->flag |= RX_FLAG_MMIC_ERROR; 19565e3dd157SKalle Valo 195721040bf9SMichal Kazior /* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to 1958453cdb61SMichal Kazior * MODE_11B. This means phy_mode is not a reliable source for the band 195921040bf9SMichal Kazior * of mgmt rx. 196021040bf9SMichal Kazior */ 196121040bf9SMichal Kazior if (channel >= 1 && channel <= 14) { 196221040bf9SMichal Kazior status->band = IEEE80211_BAND_2GHZ; 196321040bf9SMichal Kazior } else if (channel >= 36 && channel <= 165) { 196421040bf9SMichal Kazior status->band = IEEE80211_BAND_5GHZ; 1965453cdb61SMichal Kazior } else { 196621040bf9SMichal Kazior /* Shouldn't happen unless list of advertised channels to 196721040bf9SMichal Kazior * mac80211 has been changed. 196821040bf9SMichal Kazior */ 196921040bf9SMichal Kazior WARN_ON_ONCE(1); 197021040bf9SMichal Kazior dev_kfree_skb(skb); 197121040bf9SMichal Kazior return 0; 1972453cdb61SMichal Kazior } 1973453cdb61SMichal Kazior 197421040bf9SMichal Kazior if (phy_mode == MODE_11B && status->band == IEEE80211_BAND_5GHZ) 197521040bf9SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n"); 197621040bf9SMichal Kazior 197701cebe1cSMichal Kazior sband = &ar->mac.sbands[status->band]; 197801cebe1cSMichal Kazior 19795e3dd157SKalle Valo status->freq = ieee80211_channel_to_frequency(channel, status->band); 19805e3dd157SKalle Valo status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR; 198101cebe1cSMichal Kazior status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100); 19825e3dd157SKalle Valo 19835e3dd157SKalle Valo hdr = (struct ieee80211_hdr *)skb->data; 19845e3dd157SKalle Valo fc = le16_to_cpu(hdr->frame_control); 19855e3dd157SKalle Valo 1986504f6cdfSSujith Manoharan ath10k_wmi_handle_wep_reauth(ar, skb, status); 1987504f6cdfSSujith Manoharan 19882b6a6a90SMichal Kazior /* FW delivers WEP Shared Auth frame with Protected Bit set and 19892b6a6a90SMichal Kazior * encrypted payload. However in case of PMF it delivers decrypted 19902b6a6a90SMichal Kazior * frames with Protected Bit set. */ 19912b6a6a90SMichal Kazior if (ieee80211_has_protected(hdr->frame_control) && 19922b6a6a90SMichal Kazior !ieee80211_is_auth(hdr->frame_control)) { 1993eeab266cSMarek Kwaczynski status->flag |= RX_FLAG_DECRYPTED; 1994eeab266cSMarek Kwaczynski 1995eeab266cSMarek Kwaczynski if (!ieee80211_is_action(hdr->frame_control) && 1996eeab266cSMarek Kwaczynski !ieee80211_is_deauth(hdr->frame_control) && 1997eeab266cSMarek Kwaczynski !ieee80211_is_disassoc(hdr->frame_control)) { 1998eeab266cSMarek Kwaczynski status->flag |= RX_FLAG_IV_STRIPPED | 19995e3dd157SKalle Valo RX_FLAG_MMIC_STRIPPED; 20005e3dd157SKalle Valo hdr->frame_control = __cpu_to_le16(fc & 20015e3dd157SKalle Valo ~IEEE80211_FCTL_PROTECTED); 20025e3dd157SKalle Valo } 2003eeab266cSMarek Kwaczynski } 20045e3dd157SKalle Valo 2005cc9904e6SMichal Kazior if (ieee80211_is_beacon(hdr->frame_control)) 2006cc9904e6SMichal Kazior ath10k_mac_handle_beacon(ar, skb); 2007cc9904e6SMichal Kazior 20087aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 20095e3dd157SKalle Valo "event mgmt rx skb %p len %d ftype %02x stype %02x\n", 20105e3dd157SKalle Valo skb, skb->len, 20115e3dd157SKalle Valo fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE); 20125e3dd157SKalle Valo 20137aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 20145e3dd157SKalle Valo "event mgmt rx freq %d band %d snr %d, rate_idx %d\n", 20155e3dd157SKalle Valo status->freq, status->band, status->signal, 20165e3dd157SKalle Valo status->rate_idx); 20175e3dd157SKalle Valo 20185e3dd157SKalle Valo ieee80211_rx(ar->hw, skb); 20195e3dd157SKalle Valo return 0; 20205e3dd157SKalle Valo } 20215e3dd157SKalle Valo 20222e1dea40SMichal Kazior static int freq_to_idx(struct ath10k *ar, int freq) 20232e1dea40SMichal Kazior { 20242e1dea40SMichal Kazior struct ieee80211_supported_band *sband; 20252e1dea40SMichal Kazior int band, ch, idx = 0; 20262e1dea40SMichal Kazior 20272e1dea40SMichal Kazior for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) { 20282e1dea40SMichal Kazior sband = ar->hw->wiphy->bands[band]; 20292e1dea40SMichal Kazior if (!sband) 20302e1dea40SMichal Kazior continue; 20312e1dea40SMichal Kazior 20322e1dea40SMichal Kazior for (ch = 0; ch < sband->n_channels; ch++, idx++) 20332e1dea40SMichal Kazior if (sband->channels[ch].center_freq == freq) 20342e1dea40SMichal Kazior goto exit; 20352e1dea40SMichal Kazior } 20362e1dea40SMichal Kazior 20372e1dea40SMichal Kazior exit: 20382e1dea40SMichal Kazior return idx; 20392e1dea40SMichal Kazior } 20402e1dea40SMichal Kazior 2041d7579d12SMichal Kazior static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb, 204232653cf1SMichal Kazior struct wmi_ch_info_ev_arg *arg) 204332653cf1SMichal Kazior { 204432653cf1SMichal Kazior struct wmi_chan_info_event *ev = (void *)skb->data; 204532653cf1SMichal Kazior 204632653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 204732653cf1SMichal Kazior return -EPROTO; 204832653cf1SMichal Kazior 204932653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 205032653cf1SMichal Kazior arg->err_code = ev->err_code; 205132653cf1SMichal Kazior arg->freq = ev->freq; 205232653cf1SMichal Kazior arg->cmd_flags = ev->cmd_flags; 205332653cf1SMichal Kazior arg->noise_floor = ev->noise_floor; 205432653cf1SMichal Kazior arg->rx_clear_count = ev->rx_clear_count; 205532653cf1SMichal Kazior arg->cycle_count = ev->cycle_count; 205632653cf1SMichal Kazior 205732653cf1SMichal Kazior return 0; 205832653cf1SMichal Kazior } 205932653cf1SMichal Kazior 20600226d602SMichal Kazior void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb) 20615e3dd157SKalle Valo { 206232653cf1SMichal Kazior struct wmi_ch_info_ev_arg arg = {}; 20632e1dea40SMichal Kazior struct survey_info *survey; 20642e1dea40SMichal Kazior u32 err_code, freq, cmd_flags, noise_floor, rx_clear_count, cycle_count; 206532653cf1SMichal Kazior int idx, ret; 20662e1dea40SMichal Kazior 2067d7579d12SMichal Kazior ret = ath10k_wmi_pull_ch_info(ar, skb, &arg); 206832653cf1SMichal Kazior if (ret) { 206932653cf1SMichal Kazior ath10k_warn(ar, "failed to parse chan info event: %d\n", ret); 207032653cf1SMichal Kazior return; 207132653cf1SMichal Kazior } 20722e1dea40SMichal Kazior 207332653cf1SMichal Kazior err_code = __le32_to_cpu(arg.err_code); 207432653cf1SMichal Kazior freq = __le32_to_cpu(arg.freq); 207532653cf1SMichal Kazior cmd_flags = __le32_to_cpu(arg.cmd_flags); 207632653cf1SMichal Kazior noise_floor = __le32_to_cpu(arg.noise_floor); 207732653cf1SMichal Kazior rx_clear_count = __le32_to_cpu(arg.rx_clear_count); 207832653cf1SMichal Kazior cycle_count = __le32_to_cpu(arg.cycle_count); 20792e1dea40SMichal Kazior 20807aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 20812e1dea40SMichal Kazior "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n", 20822e1dea40SMichal Kazior err_code, freq, cmd_flags, noise_floor, rx_clear_count, 20832e1dea40SMichal Kazior cycle_count); 20842e1dea40SMichal Kazior 20852e1dea40SMichal Kazior spin_lock_bh(&ar->data_lock); 20862e1dea40SMichal Kazior 20875c81c7fdSMichal Kazior switch (ar->scan.state) { 20885c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 20895c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 20907aa7a72aSMichal Kazior ath10k_warn(ar, "received chan info event without a scan request, ignoring\n"); 20912e1dea40SMichal Kazior goto exit; 20925c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 20935c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 20945c81c7fdSMichal Kazior break; 20952e1dea40SMichal Kazior } 20962e1dea40SMichal Kazior 20972e1dea40SMichal Kazior idx = freq_to_idx(ar, freq); 20982e1dea40SMichal Kazior if (idx >= ARRAY_SIZE(ar->survey)) { 20997aa7a72aSMichal Kazior ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n", 21002e1dea40SMichal Kazior freq, idx); 21012e1dea40SMichal Kazior goto exit; 21022e1dea40SMichal Kazior } 21032e1dea40SMichal Kazior 21042e1dea40SMichal Kazior if (cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) { 210544b7d483SMichal Kazior if (ar->ch_info_can_report_survey) { 21062e1dea40SMichal Kazior survey = &ar->survey[idx]; 21072e1dea40SMichal Kazior survey->noise = noise_floor; 2108587f7031SMichal Kazior survey->filled = SURVEY_INFO_NOISE_DBM; 2109587f7031SMichal Kazior 2110587f7031SMichal Kazior ath10k_hw_fill_survey_time(ar, 2111587f7031SMichal Kazior survey, 2112587f7031SMichal Kazior cycle_count, 2113587f7031SMichal Kazior rx_clear_count, 2114587f7031SMichal Kazior ar->survey_last_cycle_count, 2115587f7031SMichal Kazior ar->survey_last_rx_clear_count); 21162e1dea40SMichal Kazior } 21172e1dea40SMichal Kazior 211844b7d483SMichal Kazior ar->ch_info_can_report_survey = false; 211944b7d483SMichal Kazior } else { 212044b7d483SMichal Kazior ar->ch_info_can_report_survey = true; 212144b7d483SMichal Kazior } 212244b7d483SMichal Kazior 21232e1dea40SMichal Kazior ar->survey_last_rx_clear_count = rx_clear_count; 21242e1dea40SMichal Kazior ar->survey_last_cycle_count = cycle_count; 21252e1dea40SMichal Kazior 21262e1dea40SMichal Kazior exit: 21272e1dea40SMichal Kazior spin_unlock_bh(&ar->data_lock); 21285e3dd157SKalle Valo } 21295e3dd157SKalle Valo 21300226d602SMichal Kazior void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb) 21315e3dd157SKalle Valo { 21327aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_ECHO_EVENTID\n"); 21335e3dd157SKalle Valo } 21345e3dd157SKalle Valo 21350226d602SMichal Kazior int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb) 21365e3dd157SKalle Valo { 21377aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n", 2138869526b9SKalle Valo skb->len); 2139869526b9SKalle Valo 2140d35a6c18SMichal Kazior trace_ath10k_wmi_dbglog(ar, skb->data, skb->len); 2141869526b9SKalle Valo 2142869526b9SKalle Valo return 0; 21435e3dd157SKalle Valo } 21445e3dd157SKalle Valo 2145b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src, 21465326849aSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2147d15fb520SMichal Kazior { 2148d15fb520SMichal Kazior dst->ch_noise_floor = __le32_to_cpu(src->chan_nf); 2149d15fb520SMichal Kazior dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count); 2150d15fb520SMichal Kazior dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count); 2151d15fb520SMichal Kazior dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count); 2152d15fb520SMichal Kazior dst->cycle_count = __le32_to_cpu(src->cycle_count); 2153d15fb520SMichal Kazior dst->phy_err_count = __le32_to_cpu(src->phy_err_count); 2154d15fb520SMichal Kazior dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr); 2155b91251fbSMichal Kazior } 2156d15fb520SMichal Kazior 2157b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src, 2158b91251fbSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2159b91251fbSMichal Kazior { 2160b91251fbSMichal Kazior dst->comp_queued = __le32_to_cpu(src->comp_queued); 2161b91251fbSMichal Kazior dst->comp_delivered = __le32_to_cpu(src->comp_delivered); 2162b91251fbSMichal Kazior dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued); 2163b91251fbSMichal Kazior dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued); 2164b91251fbSMichal Kazior dst->wmm_drop = __le32_to_cpu(src->wmm_drop); 2165b91251fbSMichal Kazior dst->local_enqued = __le32_to_cpu(src->local_enqued); 2166b91251fbSMichal Kazior dst->local_freed = __le32_to_cpu(src->local_freed); 2167b91251fbSMichal Kazior dst->hw_queued = __le32_to_cpu(src->hw_queued); 2168b91251fbSMichal Kazior dst->hw_reaped = __le32_to_cpu(src->hw_reaped); 2169b91251fbSMichal Kazior dst->underrun = __le32_to_cpu(src->underrun); 2170b91251fbSMichal Kazior dst->tx_abort = __le32_to_cpu(src->tx_abort); 2171b91251fbSMichal Kazior dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed); 2172b91251fbSMichal Kazior dst->tx_ko = __le32_to_cpu(src->tx_ko); 2173b91251fbSMichal Kazior dst->data_rc = __le32_to_cpu(src->data_rc); 2174b91251fbSMichal Kazior dst->self_triggers = __le32_to_cpu(src->self_triggers); 2175b91251fbSMichal Kazior dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure); 2176b91251fbSMichal Kazior dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err); 2177b91251fbSMichal Kazior dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry); 2178b91251fbSMichal Kazior dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout); 2179b91251fbSMichal Kazior dst->pdev_resets = __le32_to_cpu(src->pdev_resets); 2180b91251fbSMichal Kazior dst->phy_underrun = __le32_to_cpu(src->phy_underrun); 2181b91251fbSMichal Kazior dst->txop_ovf = __le32_to_cpu(src->txop_ovf); 2182b91251fbSMichal Kazior } 2183d15fb520SMichal Kazior 2184b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx *src, 2185b91251fbSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2186b91251fbSMichal Kazior { 2187b91251fbSMichal Kazior dst->mid_ppdu_route_change = __le32_to_cpu(src->mid_ppdu_route_change); 2188b91251fbSMichal Kazior dst->status_rcvd = __le32_to_cpu(src->status_rcvd); 2189b91251fbSMichal Kazior dst->r0_frags = __le32_to_cpu(src->r0_frags); 2190b91251fbSMichal Kazior dst->r1_frags = __le32_to_cpu(src->r1_frags); 2191b91251fbSMichal Kazior dst->r2_frags = __le32_to_cpu(src->r2_frags); 2192b91251fbSMichal Kazior dst->r3_frags = __le32_to_cpu(src->r3_frags); 2193b91251fbSMichal Kazior dst->htt_msdus = __le32_to_cpu(src->htt_msdus); 2194b91251fbSMichal Kazior dst->htt_mpdus = __le32_to_cpu(src->htt_mpdus); 2195b91251fbSMichal Kazior dst->loc_msdus = __le32_to_cpu(src->loc_msdus); 2196b91251fbSMichal Kazior dst->loc_mpdus = __le32_to_cpu(src->loc_mpdus); 2197b91251fbSMichal Kazior dst->oversize_amsdu = __le32_to_cpu(src->oversize_amsdu); 2198b91251fbSMichal Kazior dst->phy_errs = __le32_to_cpu(src->phy_errs); 2199b91251fbSMichal Kazior dst->phy_err_drop = __le32_to_cpu(src->phy_err_drop); 2200b91251fbSMichal Kazior dst->mpdu_errs = __le32_to_cpu(src->mpdu_errs); 2201b91251fbSMichal Kazior } 2202b91251fbSMichal Kazior 2203b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra *src, 2204b91251fbSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2205b91251fbSMichal Kazior { 2206b91251fbSMichal Kazior dst->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad); 2207b91251fbSMichal Kazior dst->rts_bad = __le32_to_cpu(src->rts_bad); 2208b91251fbSMichal Kazior dst->rts_good = __le32_to_cpu(src->rts_good); 2209b91251fbSMichal Kazior dst->fcs_bad = __le32_to_cpu(src->fcs_bad); 2210b91251fbSMichal Kazior dst->no_beacons = __le32_to_cpu(src->no_beacons); 2211b91251fbSMichal Kazior dst->mib_int_count = __le32_to_cpu(src->mib_int_count); 2212d15fb520SMichal Kazior } 2213d15fb520SMichal Kazior 22140226d602SMichal Kazior void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src, 221560ef401aSMichal Kazior struct ath10k_fw_stats_peer *dst) 2216d15fb520SMichal Kazior { 2217d15fb520SMichal Kazior ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr); 2218d15fb520SMichal Kazior dst->peer_rssi = __le32_to_cpu(src->peer_rssi); 2219d15fb520SMichal Kazior dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate); 2220d15fb520SMichal Kazior } 2221d15fb520SMichal Kazior 2222d7579d12SMichal Kazior static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar, 2223d15fb520SMichal Kazior struct sk_buff *skb, 222460ef401aSMichal Kazior struct ath10k_fw_stats *stats) 2225d15fb520SMichal Kazior { 2226d15fb520SMichal Kazior const struct wmi_stats_event *ev = (void *)skb->data; 2227d15fb520SMichal Kazior u32 num_pdev_stats, num_vdev_stats, num_peer_stats; 2228d15fb520SMichal Kazior int i; 2229d15fb520SMichal Kazior 2230d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 2231d15fb520SMichal Kazior return -EPROTO; 2232d15fb520SMichal Kazior 2233d15fb520SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 2234d15fb520SMichal Kazior num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 2235d15fb520SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 2236d15fb520SMichal Kazior 22375326849aSMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 2238d15fb520SMichal Kazior const struct wmi_pdev_stats *src; 22395326849aSMichal Kazior struct ath10k_fw_stats_pdev *dst; 2240d15fb520SMichal Kazior 2241d15fb520SMichal Kazior src = (void *)skb->data; 2242d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 2243d15fb520SMichal Kazior return -EPROTO; 2244d15fb520SMichal Kazior 22455326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 22465326849aSMichal Kazior if (!dst) 22475326849aSMichal Kazior continue; 22485326849aSMichal Kazior 2249b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 2250b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 2251b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 2252b91251fbSMichal Kazior 22535326849aSMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 2254d15fb520SMichal Kazior } 2255d15fb520SMichal Kazior 2256d15fb520SMichal Kazior /* fw doesn't implement vdev stats */ 2257d15fb520SMichal Kazior 2258d15fb520SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 2259d15fb520SMichal Kazior const struct wmi_peer_stats *src; 22605326849aSMichal Kazior struct ath10k_fw_stats_peer *dst; 2261d15fb520SMichal Kazior 2262d15fb520SMichal Kazior src = (void *)skb->data; 2263d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 2264d15fb520SMichal Kazior return -EPROTO; 2265d15fb520SMichal Kazior 22665326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 22675326849aSMichal Kazior if (!dst) 22685326849aSMichal Kazior continue; 22695326849aSMichal Kazior 22705326849aSMichal Kazior ath10k_wmi_pull_peer_stats(src, dst); 22715326849aSMichal Kazior list_add_tail(&dst->list, &stats->peers); 2272d15fb520SMichal Kazior } 2273d15fb520SMichal Kazior 2274d15fb520SMichal Kazior return 0; 2275d15fb520SMichal Kazior } 2276d15fb520SMichal Kazior 2277d7579d12SMichal Kazior static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar, 2278d15fb520SMichal Kazior struct sk_buff *skb, 227960ef401aSMichal Kazior struct ath10k_fw_stats *stats) 2280d15fb520SMichal Kazior { 2281d15fb520SMichal Kazior const struct wmi_stats_event *ev = (void *)skb->data; 2282d15fb520SMichal Kazior u32 num_pdev_stats, num_vdev_stats, num_peer_stats; 2283d15fb520SMichal Kazior int i; 2284d15fb520SMichal Kazior 2285d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 2286d15fb520SMichal Kazior return -EPROTO; 2287d15fb520SMichal Kazior 2288d15fb520SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 2289d15fb520SMichal Kazior num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 2290d15fb520SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 2291d15fb520SMichal Kazior 22925326849aSMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 2293d15fb520SMichal Kazior const struct wmi_10x_pdev_stats *src; 22945326849aSMichal Kazior struct ath10k_fw_stats_pdev *dst; 2295d15fb520SMichal Kazior 2296d15fb520SMichal Kazior src = (void *)skb->data; 2297d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 2298d15fb520SMichal Kazior return -EPROTO; 2299d15fb520SMichal Kazior 23005326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 23015326849aSMichal Kazior if (!dst) 23025326849aSMichal Kazior continue; 2303d15fb520SMichal Kazior 2304b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 2305b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 2306b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 2307b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 23085326849aSMichal Kazior 23095326849aSMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 2310d15fb520SMichal Kazior } 2311d15fb520SMichal Kazior 2312d15fb520SMichal Kazior /* fw doesn't implement vdev stats */ 2313d15fb520SMichal Kazior 2314d15fb520SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 2315d15fb520SMichal Kazior const struct wmi_10x_peer_stats *src; 23165326849aSMichal Kazior struct ath10k_fw_stats_peer *dst; 2317d15fb520SMichal Kazior 2318d15fb520SMichal Kazior src = (void *)skb->data; 2319d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 2320d15fb520SMichal Kazior return -EPROTO; 2321d15fb520SMichal Kazior 23225326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 23235326849aSMichal Kazior if (!dst) 23245326849aSMichal Kazior continue; 2325d15fb520SMichal Kazior 23265326849aSMichal Kazior ath10k_wmi_pull_peer_stats(&src->old, dst); 23275326849aSMichal Kazior 23285326849aSMichal Kazior dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 23295326849aSMichal Kazior 23305326849aSMichal Kazior list_add_tail(&dst->list, &stats->peers); 2331d15fb520SMichal Kazior } 2332d15fb520SMichal Kazior 2333d15fb520SMichal Kazior return 0; 2334d15fb520SMichal Kazior } 2335d15fb520SMichal Kazior 233620de2229SMichal Kazior static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar, 233720de2229SMichal Kazior struct sk_buff *skb, 233820de2229SMichal Kazior struct ath10k_fw_stats *stats) 233920de2229SMichal Kazior { 234020de2229SMichal Kazior const struct wmi_10_2_stats_event *ev = (void *)skb->data; 234120de2229SMichal Kazior u32 num_pdev_stats; 234220de2229SMichal Kazior u32 num_pdev_ext_stats; 234320de2229SMichal Kazior u32 num_vdev_stats; 234420de2229SMichal Kazior u32 num_peer_stats; 234520de2229SMichal Kazior int i; 234620de2229SMichal Kazior 234720de2229SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 234820de2229SMichal Kazior return -EPROTO; 234920de2229SMichal Kazior 235020de2229SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 235120de2229SMichal Kazior num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 235220de2229SMichal Kazior num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 235320de2229SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 235420de2229SMichal Kazior 235520de2229SMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 235620de2229SMichal Kazior const struct wmi_10_2_pdev_stats *src; 235720de2229SMichal Kazior struct ath10k_fw_stats_pdev *dst; 235820de2229SMichal Kazior 235920de2229SMichal Kazior src = (void *)skb->data; 236020de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 236120de2229SMichal Kazior return -EPROTO; 236220de2229SMichal Kazior 236320de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 236420de2229SMichal Kazior if (!dst) 236520de2229SMichal Kazior continue; 236620de2229SMichal Kazior 236720de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 236820de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 236920de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 237020de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 237120de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 237220de2229SMichal Kazior 237320de2229SMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 237420de2229SMichal Kazior } 237520de2229SMichal Kazior 237620de2229SMichal Kazior for (i = 0; i < num_pdev_ext_stats; i++) { 237720de2229SMichal Kazior const struct wmi_10_2_pdev_ext_stats *src; 237820de2229SMichal Kazior 237920de2229SMichal Kazior src = (void *)skb->data; 238020de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 238120de2229SMichal Kazior return -EPROTO; 238220de2229SMichal Kazior 238320de2229SMichal Kazior /* FIXME: expose values to userspace 238420de2229SMichal Kazior * 238520de2229SMichal Kazior * Note: Even though this loop seems to do nothing it is 238620de2229SMichal Kazior * required to parse following sub-structures properly. 238720de2229SMichal Kazior */ 238820de2229SMichal Kazior } 238920de2229SMichal Kazior 239020de2229SMichal Kazior /* fw doesn't implement vdev stats */ 239120de2229SMichal Kazior 239220de2229SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 239320de2229SMichal Kazior const struct wmi_10_2_peer_stats *src; 239420de2229SMichal Kazior struct ath10k_fw_stats_peer *dst; 239520de2229SMichal Kazior 239620de2229SMichal Kazior src = (void *)skb->data; 239720de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 239820de2229SMichal Kazior return -EPROTO; 239920de2229SMichal Kazior 240020de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 240120de2229SMichal Kazior if (!dst) 240220de2229SMichal Kazior continue; 240320de2229SMichal Kazior 240420de2229SMichal Kazior ath10k_wmi_pull_peer_stats(&src->old, dst); 240520de2229SMichal Kazior 240620de2229SMichal Kazior dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 240720de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 240820de2229SMichal Kazior 240920de2229SMichal Kazior list_add_tail(&dst->list, &stats->peers); 241020de2229SMichal Kazior } 241120de2229SMichal Kazior 241220de2229SMichal Kazior return 0; 241320de2229SMichal Kazior } 241420de2229SMichal Kazior 241520de2229SMichal Kazior static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar, 241620de2229SMichal Kazior struct sk_buff *skb, 241720de2229SMichal Kazior struct ath10k_fw_stats *stats) 241820de2229SMichal Kazior { 241920de2229SMichal Kazior const struct wmi_10_2_stats_event *ev = (void *)skb->data; 242020de2229SMichal Kazior u32 num_pdev_stats; 242120de2229SMichal Kazior u32 num_pdev_ext_stats; 242220de2229SMichal Kazior u32 num_vdev_stats; 242320de2229SMichal Kazior u32 num_peer_stats; 242420de2229SMichal Kazior int i; 242520de2229SMichal Kazior 242620de2229SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 242720de2229SMichal Kazior return -EPROTO; 242820de2229SMichal Kazior 242920de2229SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 243020de2229SMichal Kazior num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 243120de2229SMichal Kazior num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 243220de2229SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 243320de2229SMichal Kazior 243420de2229SMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 243520de2229SMichal Kazior const struct wmi_10_2_pdev_stats *src; 243620de2229SMichal Kazior struct ath10k_fw_stats_pdev *dst; 243720de2229SMichal Kazior 243820de2229SMichal Kazior src = (void *)skb->data; 243920de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 244020de2229SMichal Kazior return -EPROTO; 244120de2229SMichal Kazior 244220de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 244320de2229SMichal Kazior if (!dst) 244420de2229SMichal Kazior continue; 244520de2229SMichal Kazior 244620de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 244720de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 244820de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 244920de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 245020de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 245120de2229SMichal Kazior 245220de2229SMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 245320de2229SMichal Kazior } 245420de2229SMichal Kazior 245520de2229SMichal Kazior for (i = 0; i < num_pdev_ext_stats; i++) { 245620de2229SMichal Kazior const struct wmi_10_2_pdev_ext_stats *src; 245720de2229SMichal Kazior 245820de2229SMichal Kazior src = (void *)skb->data; 245920de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 246020de2229SMichal Kazior return -EPROTO; 246120de2229SMichal Kazior 246220de2229SMichal Kazior /* FIXME: expose values to userspace 246320de2229SMichal Kazior * 246420de2229SMichal Kazior * Note: Even though this loop seems to do nothing it is 246520de2229SMichal Kazior * required to parse following sub-structures properly. 246620de2229SMichal Kazior */ 246720de2229SMichal Kazior } 246820de2229SMichal Kazior 246920de2229SMichal Kazior /* fw doesn't implement vdev stats */ 247020de2229SMichal Kazior 247120de2229SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 247220de2229SMichal Kazior const struct wmi_10_2_4_peer_stats *src; 247320de2229SMichal Kazior struct ath10k_fw_stats_peer *dst; 247420de2229SMichal Kazior 247520de2229SMichal Kazior src = (void *)skb->data; 247620de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 247720de2229SMichal Kazior return -EPROTO; 247820de2229SMichal Kazior 247920de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 248020de2229SMichal Kazior if (!dst) 248120de2229SMichal Kazior continue; 248220de2229SMichal Kazior 248320de2229SMichal Kazior ath10k_wmi_pull_peer_stats(&src->common.old, dst); 248420de2229SMichal Kazior 248520de2229SMichal Kazior dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate); 248620de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 248720de2229SMichal Kazior 248820de2229SMichal Kazior list_add_tail(&dst->list, &stats->peers); 248920de2229SMichal Kazior } 249020de2229SMichal Kazior 249120de2229SMichal Kazior return 0; 249220de2229SMichal Kazior } 249320de2229SMichal Kazior 24940226d602SMichal Kazior void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb) 24955e3dd157SKalle Valo { 24967aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n"); 249760ef401aSMichal Kazior ath10k_debug_fw_stats_process(ar, skb); 24985e3dd157SKalle Valo } 24995e3dd157SKalle Valo 2500d7579d12SMichal Kazior static int 2501d7579d12SMichal Kazior ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb, 250232653cf1SMichal Kazior struct wmi_vdev_start_ev_arg *arg) 250332653cf1SMichal Kazior { 250432653cf1SMichal Kazior struct wmi_vdev_start_response_event *ev = (void *)skb->data; 250532653cf1SMichal Kazior 250632653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 250732653cf1SMichal Kazior return -EPROTO; 250832653cf1SMichal Kazior 250932653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 251032653cf1SMichal Kazior arg->vdev_id = ev->vdev_id; 251132653cf1SMichal Kazior arg->req_id = ev->req_id; 251232653cf1SMichal Kazior arg->resp_type = ev->resp_type; 251332653cf1SMichal Kazior arg->status = ev->status; 251432653cf1SMichal Kazior 251532653cf1SMichal Kazior return 0; 251632653cf1SMichal Kazior } 251732653cf1SMichal Kazior 25180226d602SMichal Kazior void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb) 25195e3dd157SKalle Valo { 252032653cf1SMichal Kazior struct wmi_vdev_start_ev_arg arg = {}; 252132653cf1SMichal Kazior int ret; 25225e3dd157SKalle Valo 25237aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n"); 25245e3dd157SKalle Valo 2525d7579d12SMichal Kazior ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg); 252632653cf1SMichal Kazior if (ret) { 252732653cf1SMichal Kazior ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret); 252832653cf1SMichal Kazior return; 252932653cf1SMichal Kazior } 25305e3dd157SKalle Valo 253132653cf1SMichal Kazior if (WARN_ON(__le32_to_cpu(arg.status))) 25325e3dd157SKalle Valo return; 25335e3dd157SKalle Valo 25345e3dd157SKalle Valo complete(&ar->vdev_setup_done); 25355e3dd157SKalle Valo } 25365e3dd157SKalle Valo 25370226d602SMichal Kazior void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb) 25385e3dd157SKalle Valo { 25397aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n"); 25405e3dd157SKalle Valo complete(&ar->vdev_setup_done); 25415e3dd157SKalle Valo } 25425e3dd157SKalle Valo 2543d7579d12SMichal Kazior static int 2544d7579d12SMichal Kazior ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb, 254532653cf1SMichal Kazior struct wmi_peer_kick_ev_arg *arg) 254632653cf1SMichal Kazior { 254732653cf1SMichal Kazior struct wmi_peer_sta_kickout_event *ev = (void *)skb->data; 254832653cf1SMichal Kazior 254932653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 255032653cf1SMichal Kazior return -EPROTO; 255132653cf1SMichal Kazior 255232653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 255332653cf1SMichal Kazior arg->mac_addr = ev->peer_macaddr.addr; 255432653cf1SMichal Kazior 255532653cf1SMichal Kazior return 0; 255632653cf1SMichal Kazior } 255732653cf1SMichal Kazior 25580226d602SMichal Kazior void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb) 25595e3dd157SKalle Valo { 256032653cf1SMichal Kazior struct wmi_peer_kick_ev_arg arg = {}; 25615a13e76eSKalle Valo struct ieee80211_sta *sta; 256232653cf1SMichal Kazior int ret; 25635a13e76eSKalle Valo 2564d7579d12SMichal Kazior ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg); 256532653cf1SMichal Kazior if (ret) { 256632653cf1SMichal Kazior ath10k_warn(ar, "failed to parse peer kickout event: %d\n", 256732653cf1SMichal Kazior ret); 256832653cf1SMichal Kazior return; 256932653cf1SMichal Kazior } 25705a13e76eSKalle Valo 25717aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n", 257232653cf1SMichal Kazior arg.mac_addr); 25735a13e76eSKalle Valo 25745a13e76eSKalle Valo rcu_read_lock(); 25755a13e76eSKalle Valo 257632653cf1SMichal Kazior sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL); 25775a13e76eSKalle Valo if (!sta) { 25787aa7a72aSMichal Kazior ath10k_warn(ar, "Spurious quick kickout for STA %pM\n", 257932653cf1SMichal Kazior arg.mac_addr); 25805a13e76eSKalle Valo goto exit; 25815a13e76eSKalle Valo } 25825a13e76eSKalle Valo 25835a13e76eSKalle Valo ieee80211_report_low_ack(sta, 10); 25845a13e76eSKalle Valo 25855a13e76eSKalle Valo exit: 25865a13e76eSKalle Valo rcu_read_unlock(); 25875e3dd157SKalle Valo } 25885e3dd157SKalle Valo 25895e3dd157SKalle Valo /* 25905e3dd157SKalle Valo * FIXME 25915e3dd157SKalle Valo * 25925e3dd157SKalle Valo * We don't report to mac80211 sleep state of connected 25935e3dd157SKalle Valo * stations. Due to this mac80211 can't fill in TIM IE 25945e3dd157SKalle Valo * correctly. 25955e3dd157SKalle Valo * 25965e3dd157SKalle Valo * I know of no way of getting nullfunc frames that contain 25975e3dd157SKalle Valo * sleep transition from connected stations - these do not 25985e3dd157SKalle Valo * seem to be sent from the target to the host. There also 25995e3dd157SKalle Valo * doesn't seem to be a dedicated event for that. So the 26005e3dd157SKalle Valo * only way left to do this would be to read tim_bitmap 26015e3dd157SKalle Valo * during SWBA. 26025e3dd157SKalle Valo * 26035e3dd157SKalle Valo * We could probably try using tim_bitmap from SWBA to tell 26045e3dd157SKalle Valo * mac80211 which stations are asleep and which are not. The 26055e3dd157SKalle Valo * problem here is calling mac80211 functions so many times 26065e3dd157SKalle Valo * could take too long and make us miss the time to submit 26075e3dd157SKalle Valo * the beacon to the target. 26085e3dd157SKalle Valo * 26095e3dd157SKalle Valo * So as a workaround we try to extend the TIM IE if there 26105e3dd157SKalle Valo * is unicast buffered for stations with aid > 7 and fill it 26115e3dd157SKalle Valo * in ourselves. 26125e3dd157SKalle Valo */ 26135e3dd157SKalle Valo static void ath10k_wmi_update_tim(struct ath10k *ar, 26145e3dd157SKalle Valo struct ath10k_vif *arvif, 26155e3dd157SKalle Valo struct sk_buff *bcn, 261632653cf1SMichal Kazior const struct wmi_tim_info *tim_info) 26175e3dd157SKalle Valo { 26185e3dd157SKalle Valo struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data; 26195e3dd157SKalle Valo struct ieee80211_tim_ie *tim; 26205e3dd157SKalle Valo u8 *ies, *ie; 26215e3dd157SKalle Valo u8 ie_len, pvm_len; 2622af762c0bSKalle Valo __le32 t; 2623af762c0bSKalle Valo u32 v; 26245e3dd157SKalle Valo 26255e3dd157SKalle Valo /* if next SWBA has no tim_changed the tim_bitmap is garbage. 26265e3dd157SKalle Valo * we must copy the bitmap upon change and reuse it later */ 262732653cf1SMichal Kazior if (__le32_to_cpu(tim_info->tim_changed)) { 26285e3dd157SKalle Valo int i; 26295e3dd157SKalle Valo 26305e3dd157SKalle Valo BUILD_BUG_ON(sizeof(arvif->u.ap.tim_bitmap) != 263132653cf1SMichal Kazior sizeof(tim_info->tim_bitmap)); 26325e3dd157SKalle Valo 26335e3dd157SKalle Valo for (i = 0; i < sizeof(arvif->u.ap.tim_bitmap); i++) { 263432653cf1SMichal Kazior t = tim_info->tim_bitmap[i / 4]; 2635af762c0bSKalle Valo v = __le32_to_cpu(t); 26365e3dd157SKalle Valo arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF; 26375e3dd157SKalle Valo } 26385e3dd157SKalle Valo 26395e3dd157SKalle Valo /* FW reports either length 0 or 16 26405e3dd157SKalle Valo * so we calculate this on our own */ 26415e3dd157SKalle Valo arvif->u.ap.tim_len = 0; 26425e3dd157SKalle Valo for (i = 0; i < sizeof(arvif->u.ap.tim_bitmap); i++) 26435e3dd157SKalle Valo if (arvif->u.ap.tim_bitmap[i]) 26445e3dd157SKalle Valo arvif->u.ap.tim_len = i; 26455e3dd157SKalle Valo 26465e3dd157SKalle Valo arvif->u.ap.tim_len++; 26475e3dd157SKalle Valo } 26485e3dd157SKalle Valo 26495e3dd157SKalle Valo ies = bcn->data; 26505e3dd157SKalle Valo ies += ieee80211_hdrlen(hdr->frame_control); 26515e3dd157SKalle Valo ies += 12; /* fixed parameters */ 26525e3dd157SKalle Valo 26535e3dd157SKalle Valo ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies, 26545e3dd157SKalle Valo (u8 *)skb_tail_pointer(bcn) - ies); 26555e3dd157SKalle Valo if (!ie) { 265609af8f85SMichal Kazior if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS) 26577aa7a72aSMichal Kazior ath10k_warn(ar, "no tim ie found;\n"); 26585e3dd157SKalle Valo return; 26595e3dd157SKalle Valo } 26605e3dd157SKalle Valo 26615e3dd157SKalle Valo tim = (void *)ie + 2; 26625e3dd157SKalle Valo ie_len = ie[1]; 26635e3dd157SKalle Valo pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */ 26645e3dd157SKalle Valo 26655e3dd157SKalle Valo if (pvm_len < arvif->u.ap.tim_len) { 26665e3dd157SKalle Valo int expand_size = sizeof(arvif->u.ap.tim_bitmap) - pvm_len; 26675e3dd157SKalle Valo int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len); 26685e3dd157SKalle Valo void *next_ie = ie + 2 + ie_len; 26695e3dd157SKalle Valo 26705e3dd157SKalle Valo if (skb_put(bcn, expand_size)) { 26715e3dd157SKalle Valo memmove(next_ie + expand_size, next_ie, move_size); 26725e3dd157SKalle Valo 26735e3dd157SKalle Valo ie[1] += expand_size; 26745e3dd157SKalle Valo ie_len += expand_size; 26755e3dd157SKalle Valo pvm_len += expand_size; 26765e3dd157SKalle Valo } else { 26777aa7a72aSMichal Kazior ath10k_warn(ar, "tim expansion failed\n"); 26785e3dd157SKalle Valo } 26795e3dd157SKalle Valo } 26805e3dd157SKalle Valo 26815e3dd157SKalle Valo if (pvm_len > sizeof(arvif->u.ap.tim_bitmap)) { 26827aa7a72aSMichal Kazior ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len); 26835e3dd157SKalle Valo return; 26845e3dd157SKalle Valo } 26855e3dd157SKalle Valo 268632653cf1SMichal Kazior tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast); 26875e3dd157SKalle Valo memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len); 26885e3dd157SKalle Valo 2689748afc47SMichal Kazior if (tim->dtim_count == 0) { 2690748afc47SMichal Kazior ATH10K_SKB_CB(bcn)->bcn.dtim_zero = true; 2691748afc47SMichal Kazior 269232653cf1SMichal Kazior if (__le32_to_cpu(tim_info->tim_mcast) == 1) 2693748afc47SMichal Kazior ATH10K_SKB_CB(bcn)->bcn.deliver_cab = true; 2694748afc47SMichal Kazior } 2695748afc47SMichal Kazior 26967aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n", 26975e3dd157SKalle Valo tim->dtim_count, tim->dtim_period, 26985e3dd157SKalle Valo tim->bitmap_ctrl, pvm_len); 26995e3dd157SKalle Valo } 27005e3dd157SKalle Valo 27015e3dd157SKalle Valo static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif, 27025e3dd157SKalle Valo struct sk_buff *bcn, 270332653cf1SMichal Kazior const struct wmi_p2p_noa_info *noa) 27045e3dd157SKalle Valo { 27055e3dd157SKalle Valo if (arvif->vdev_subtype != WMI_VDEV_SUBTYPE_P2P_GO) 27065e3dd157SKalle Valo return; 27075e3dd157SKalle Valo 27087aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed); 27095e3dd157SKalle Valo 27106a94888fSMichal Kazior if (noa->changed & WMI_P2P_NOA_CHANGED_BIT) 27116a94888fSMichal Kazior ath10k_p2p_noa_update(arvif, noa); 27125e3dd157SKalle Valo 27135e3dd157SKalle Valo if (arvif->u.ap.noa_data) 27145e3dd157SKalle Valo if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC)) 27155e3dd157SKalle Valo memcpy(skb_put(bcn, arvif->u.ap.noa_len), 27165e3dd157SKalle Valo arvif->u.ap.noa_data, 27175e3dd157SKalle Valo arvif->u.ap.noa_len); 27185e3dd157SKalle Valo 27196a94888fSMichal Kazior return; 27205e3dd157SKalle Valo } 27215e3dd157SKalle Valo 2722d7579d12SMichal Kazior static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb, 272332653cf1SMichal Kazior struct wmi_swba_ev_arg *arg) 272432653cf1SMichal Kazior { 272532653cf1SMichal Kazior struct wmi_host_swba_event *ev = (void *)skb->data; 272632653cf1SMichal Kazior u32 map; 272732653cf1SMichal Kazior size_t i; 272832653cf1SMichal Kazior 272932653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 273032653cf1SMichal Kazior return -EPROTO; 273132653cf1SMichal Kazior 273232653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 273332653cf1SMichal Kazior arg->vdev_map = ev->vdev_map; 273432653cf1SMichal Kazior 273532653cf1SMichal Kazior for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) { 273632653cf1SMichal Kazior if (!(map & BIT(0))) 273732653cf1SMichal Kazior continue; 273832653cf1SMichal Kazior 273932653cf1SMichal Kazior /* If this happens there were some changes in firmware and 274032653cf1SMichal Kazior * ath10k should update the max size of tim_info array. 274132653cf1SMichal Kazior */ 274232653cf1SMichal Kazior if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info))) 274332653cf1SMichal Kazior break; 274432653cf1SMichal Kazior 274532653cf1SMichal Kazior arg->tim_info[i] = &ev->bcn_info[i].tim_info; 274632653cf1SMichal Kazior arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info; 274732653cf1SMichal Kazior i++; 274832653cf1SMichal Kazior } 274932653cf1SMichal Kazior 275032653cf1SMichal Kazior return 0; 275132653cf1SMichal Kazior } 275232653cf1SMichal Kazior 27530226d602SMichal Kazior void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb) 27545e3dd157SKalle Valo { 275532653cf1SMichal Kazior struct wmi_swba_ev_arg arg = {}; 27565e3dd157SKalle Valo u32 map; 27575e3dd157SKalle Valo int i = -1; 275832653cf1SMichal Kazior const struct wmi_tim_info *tim_info; 275932653cf1SMichal Kazior const struct wmi_p2p_noa_info *noa_info; 27605e3dd157SKalle Valo struct ath10k_vif *arvif; 27615e3dd157SKalle Valo struct sk_buff *bcn; 276264badcb6SMichal Kazior dma_addr_t paddr; 2763767d34fcSMichal Kazior int ret, vdev_id = 0; 27645e3dd157SKalle Valo 2765d7579d12SMichal Kazior ret = ath10k_wmi_pull_swba(ar, skb, &arg); 276632653cf1SMichal Kazior if (ret) { 276732653cf1SMichal Kazior ath10k_warn(ar, "failed to parse swba event: %d\n", ret); 276832653cf1SMichal Kazior return; 276932653cf1SMichal Kazior } 277032653cf1SMichal Kazior 277132653cf1SMichal Kazior map = __le32_to_cpu(arg.vdev_map); 27725e3dd157SKalle Valo 27737aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n", 277432653cf1SMichal Kazior map); 27755e3dd157SKalle Valo 27765e3dd157SKalle Valo for (; map; map >>= 1, vdev_id++) { 27775e3dd157SKalle Valo if (!(map & 0x1)) 27785e3dd157SKalle Valo continue; 27795e3dd157SKalle Valo 27805e3dd157SKalle Valo i++; 27815e3dd157SKalle Valo 27825e3dd157SKalle Valo if (i >= WMI_MAX_AP_VDEV) { 27837aa7a72aSMichal Kazior ath10k_warn(ar, "swba has corrupted vdev map\n"); 27845e3dd157SKalle Valo break; 27855e3dd157SKalle Valo } 27865e3dd157SKalle Valo 278732653cf1SMichal Kazior tim_info = arg.tim_info[i]; 278832653cf1SMichal Kazior noa_info = arg.noa_info[i]; 27895e3dd157SKalle Valo 27907aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 27917a8a396bSKalle Valo "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n", 27925e3dd157SKalle Valo i, 279332653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_len), 279432653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_mcast), 279532653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_changed), 279632653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_num_ps_pending), 279732653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[3]), 279832653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[2]), 279932653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[1]), 280032653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[0])); 28015e3dd157SKalle Valo 28025e3dd157SKalle Valo arvif = ath10k_get_arvif(ar, vdev_id); 28035e3dd157SKalle Valo if (arvif == NULL) { 28047aa7a72aSMichal Kazior ath10k_warn(ar, "no vif for vdev_id %d found\n", 28057aa7a72aSMichal Kazior vdev_id); 28065e3dd157SKalle Valo continue; 28075e3dd157SKalle Valo } 28085e3dd157SKalle Valo 2809c2df44b3SMichal Kazior /* There are no completions for beacons so wait for next SWBA 2810c2df44b3SMichal Kazior * before telling mac80211 to decrement CSA counter 2811c2df44b3SMichal Kazior * 2812c2df44b3SMichal Kazior * Once CSA counter is completed stop sending beacons until 2813c2df44b3SMichal Kazior * actual channel switch is done */ 2814c2df44b3SMichal Kazior if (arvif->vif->csa_active && 2815c2df44b3SMichal Kazior ieee80211_csa_is_complete(arvif->vif)) { 2816c2df44b3SMichal Kazior ieee80211_csa_finish(arvif->vif); 2817c2df44b3SMichal Kazior continue; 2818c2df44b3SMichal Kazior } 2819c2df44b3SMichal Kazior 28205e3dd157SKalle Valo bcn = ieee80211_beacon_get(ar->hw, arvif->vif); 28215e3dd157SKalle Valo if (!bcn) { 28227aa7a72aSMichal Kazior ath10k_warn(ar, "could not get mac80211 beacon\n"); 28235e3dd157SKalle Valo continue; 28245e3dd157SKalle Valo } 28255e3dd157SKalle Valo 28264b604558SMichal Kazior ath10k_tx_h_seq_no(arvif->vif, bcn); 282732653cf1SMichal Kazior ath10k_wmi_update_tim(ar, arvif, bcn, tim_info); 282832653cf1SMichal Kazior ath10k_wmi_update_noa(ar, arvif, bcn, noa_info); 28295e3dd157SKalle Valo 2830ed54388aSMichal Kazior spin_lock_bh(&ar->data_lock); 2831748afc47SMichal Kazior 2832ed54388aSMichal Kazior if (arvif->beacon) { 2833af21319fSMichal Kazior switch (arvif->beacon_state) { 2834af21319fSMichal Kazior case ATH10K_BEACON_SENT: 2835af21319fSMichal Kazior break; 2836af21319fSMichal Kazior case ATH10K_BEACON_SCHEDULED: 2837af21319fSMichal Kazior ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n", 2838ed54388aSMichal Kazior arvif->vdev_id); 2839af21319fSMichal Kazior break; 2840af21319fSMichal Kazior case ATH10K_BEACON_SENDING: 2841af21319fSMichal Kazior ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n", 2842af21319fSMichal Kazior arvif->vdev_id); 2843af21319fSMichal Kazior dev_kfree_skb(bcn); 2844af21319fSMichal Kazior goto skip; 2845af21319fSMichal Kazior } 2846748afc47SMichal Kazior 284764badcb6SMichal Kazior ath10k_mac_vif_beacon_free(arvif); 2848ed54388aSMichal Kazior } 28495e3dd157SKalle Valo 285064badcb6SMichal Kazior if (!arvif->beacon_buf) { 285164badcb6SMichal Kazior paddr = dma_map_single(arvif->ar->dev, bcn->data, 285264badcb6SMichal Kazior bcn->len, DMA_TO_DEVICE); 285364badcb6SMichal Kazior ret = dma_mapping_error(arvif->ar->dev, paddr); 2854767d34fcSMichal Kazior if (ret) { 285564badcb6SMichal Kazior ath10k_warn(ar, "failed to map beacon: %d\n", 285664badcb6SMichal Kazior ret); 2857ad3d2153SMichal Kazior dev_kfree_skb_any(bcn); 2858767d34fcSMichal Kazior goto skip; 2859767d34fcSMichal Kazior } 2860748afc47SMichal Kazior 286164badcb6SMichal Kazior ATH10K_SKB_CB(bcn)->paddr = paddr; 286264badcb6SMichal Kazior } else { 286364badcb6SMichal Kazior if (bcn->len > IEEE80211_MAX_FRAME_LEN) { 286464badcb6SMichal Kazior ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n", 286564badcb6SMichal Kazior bcn->len, IEEE80211_MAX_FRAME_LEN); 286664badcb6SMichal Kazior skb_trim(bcn, IEEE80211_MAX_FRAME_LEN); 286764badcb6SMichal Kazior } 286864badcb6SMichal Kazior memcpy(arvif->beacon_buf, bcn->data, bcn->len); 286964badcb6SMichal Kazior ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr; 287064badcb6SMichal Kazior } 287164badcb6SMichal Kazior 2872ed54388aSMichal Kazior arvif->beacon = bcn; 2873af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SCHEDULED; 28745e3dd157SKalle Valo 28755ce8e7fdSRajkumar Manoharan trace_ath10k_tx_hdr(ar, bcn->data, bcn->len); 28765ce8e7fdSRajkumar Manoharan trace_ath10k_tx_payload(ar, bcn->data, bcn->len); 28775ce8e7fdSRajkumar Manoharan 2878767d34fcSMichal Kazior skip: 2879ed54388aSMichal Kazior spin_unlock_bh(&ar->data_lock); 28805e3dd157SKalle Valo } 2881af21319fSMichal Kazior 2882af21319fSMichal Kazior ath10k_wmi_tx_beacons_nowait(ar); 28835e3dd157SKalle Valo } 28845e3dd157SKalle Valo 28850226d602SMichal Kazior void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb) 28865e3dd157SKalle Valo { 28877aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n"); 28885e3dd157SKalle Valo } 28895e3dd157SKalle Valo 28909702c686SJanusz Dziedzic static void ath10k_dfs_radar_report(struct ath10k *ar, 28912332d0aeSMichal Kazior const struct wmi_phyerr *phyerr, 28922332d0aeSMichal Kazior const struct phyerr_radar_report *rr, 28939702c686SJanusz Dziedzic u64 tsf) 28949702c686SJanusz Dziedzic { 28959702c686SJanusz Dziedzic u32 reg0, reg1, tsf32l; 2896500ff9f9SMichal Kazior struct ieee80211_channel *ch; 28979702c686SJanusz Dziedzic struct pulse_event pe; 28989702c686SJanusz Dziedzic u64 tsf64; 28999702c686SJanusz Dziedzic u8 rssi, width; 29009702c686SJanusz Dziedzic 29019702c686SJanusz Dziedzic reg0 = __le32_to_cpu(rr->reg0); 29029702c686SJanusz Dziedzic reg1 = __le32_to_cpu(rr->reg1); 29039702c686SJanusz Dziedzic 29047aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 29059702c686SJanusz Dziedzic "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n", 29069702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP), 29079702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH), 29089702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN), 29099702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF)); 29107aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 29119702c686SJanusz Dziedzic "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n", 29129702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK), 29139702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX), 29149702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID), 29159702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN), 29169702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK)); 29177aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 29189702c686SJanusz Dziedzic "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n", 29199702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET), 29209702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_DUR)); 29219702c686SJanusz Dziedzic 29229702c686SJanusz Dziedzic if (!ar->dfs_detector) 29239702c686SJanusz Dziedzic return; 29249702c686SJanusz Dziedzic 2925500ff9f9SMichal Kazior spin_lock_bh(&ar->data_lock); 2926500ff9f9SMichal Kazior ch = ar->rx_channel; 2927500ff9f9SMichal Kazior spin_unlock_bh(&ar->data_lock); 2928500ff9f9SMichal Kazior 2929500ff9f9SMichal Kazior if (!ch) { 2930500ff9f9SMichal Kazior ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n"); 2931500ff9f9SMichal Kazior goto radar_detected; 2932500ff9f9SMichal Kazior } 2933500ff9f9SMichal Kazior 29349702c686SJanusz Dziedzic /* report event to DFS pattern detector */ 29352332d0aeSMichal Kazior tsf32l = __le32_to_cpu(phyerr->tsf_timestamp); 29369702c686SJanusz Dziedzic tsf64 = tsf & (~0xFFFFFFFFULL); 29379702c686SJanusz Dziedzic tsf64 |= tsf32l; 29389702c686SJanusz Dziedzic 29399702c686SJanusz Dziedzic width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR); 29402332d0aeSMichal Kazior rssi = phyerr->rssi_combined; 29419702c686SJanusz Dziedzic 29429702c686SJanusz Dziedzic /* hardware store this as 8 bit signed value, 29439702c686SJanusz Dziedzic * set to zero if negative number 29449702c686SJanusz Dziedzic */ 29459702c686SJanusz Dziedzic if (rssi & 0x80) 29469702c686SJanusz Dziedzic rssi = 0; 29479702c686SJanusz Dziedzic 29489702c686SJanusz Dziedzic pe.ts = tsf64; 2949500ff9f9SMichal Kazior pe.freq = ch->center_freq; 29509702c686SJanusz Dziedzic pe.width = width; 29519702c686SJanusz Dziedzic pe.rssi = rssi; 29522c3f26a0SPeter Oh pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0); 29537aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 29549702c686SJanusz Dziedzic "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n", 29559702c686SJanusz Dziedzic pe.freq, pe.width, pe.rssi, pe.ts); 29569702c686SJanusz Dziedzic 29579702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, pulses_detected); 29589702c686SJanusz Dziedzic 29599702c686SJanusz Dziedzic if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe)) { 29607aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 29619702c686SJanusz Dziedzic "dfs no pulse pattern detected, yet\n"); 29629702c686SJanusz Dziedzic return; 29639702c686SJanusz Dziedzic } 29649702c686SJanusz Dziedzic 2965500ff9f9SMichal Kazior radar_detected: 29667aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n"); 29679702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, radar_detected); 29687d9b40b4SMarek Puzyniak 29697d9b40b4SMarek Puzyniak /* Control radar events reporting in debugfs file 29707d9b40b4SMarek Puzyniak dfs_block_radar_events */ 29717d9b40b4SMarek Puzyniak if (ar->dfs_block_radar_events) { 29727aa7a72aSMichal Kazior ath10k_info(ar, "DFS Radar detected, but ignored as requested\n"); 29737d9b40b4SMarek Puzyniak return; 29747d9b40b4SMarek Puzyniak } 29757d9b40b4SMarek Puzyniak 29769702c686SJanusz Dziedzic ieee80211_radar_detected(ar->hw); 29779702c686SJanusz Dziedzic } 29789702c686SJanusz Dziedzic 29799702c686SJanusz Dziedzic static int ath10k_dfs_fft_report(struct ath10k *ar, 29802332d0aeSMichal Kazior const struct wmi_phyerr *phyerr, 29812332d0aeSMichal Kazior const struct phyerr_fft_report *fftr, 29829702c686SJanusz Dziedzic u64 tsf) 29839702c686SJanusz Dziedzic { 29849702c686SJanusz Dziedzic u32 reg0, reg1; 29859702c686SJanusz Dziedzic u8 rssi, peak_mag; 29869702c686SJanusz Dziedzic 29879702c686SJanusz Dziedzic reg0 = __le32_to_cpu(fftr->reg0); 29889702c686SJanusz Dziedzic reg1 = __le32_to_cpu(fftr->reg1); 29892332d0aeSMichal Kazior rssi = phyerr->rssi_combined; 29909702c686SJanusz Dziedzic 29917aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 29929702c686SJanusz Dziedzic "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n", 29939702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB), 29949702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB), 29959702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX), 29969702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX)); 29977aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 29989702c686SJanusz Dziedzic "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n", 29999702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB), 30009702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB), 30019702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG), 30029702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB)); 30039702c686SJanusz Dziedzic 30049702c686SJanusz Dziedzic peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG); 30059702c686SJanusz Dziedzic 30069702c686SJanusz Dziedzic /* false event detection */ 30079702c686SJanusz Dziedzic if (rssi == DFS_RSSI_POSSIBLY_FALSE && 30089702c686SJanusz Dziedzic peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) { 30097aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n"); 30109702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, pulses_discarded); 30119702c686SJanusz Dziedzic return -EINVAL; 30129702c686SJanusz Dziedzic } 30139702c686SJanusz Dziedzic 30149702c686SJanusz Dziedzic return 0; 30159702c686SJanusz Dziedzic } 30169702c686SJanusz Dziedzic 30170226d602SMichal Kazior void ath10k_wmi_event_dfs(struct ath10k *ar, 30182332d0aeSMichal Kazior const struct wmi_phyerr *phyerr, 30199702c686SJanusz Dziedzic u64 tsf) 30209702c686SJanusz Dziedzic { 30219702c686SJanusz Dziedzic int buf_len, tlv_len, res, i = 0; 30222332d0aeSMichal Kazior const struct phyerr_tlv *tlv; 30232332d0aeSMichal Kazior const struct phyerr_radar_report *rr; 30242332d0aeSMichal Kazior const struct phyerr_fft_report *fftr; 30252332d0aeSMichal Kazior const u8 *tlv_buf; 30269702c686SJanusz Dziedzic 30272332d0aeSMichal Kazior buf_len = __le32_to_cpu(phyerr->buf_len); 30287aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 30299702c686SJanusz Dziedzic "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n", 30302332d0aeSMichal Kazior phyerr->phy_err_code, phyerr->rssi_combined, 30312332d0aeSMichal Kazior __le32_to_cpu(phyerr->tsf_timestamp), tsf, buf_len); 30329702c686SJanusz Dziedzic 30339702c686SJanusz Dziedzic /* Skip event if DFS disabled */ 30349702c686SJanusz Dziedzic if (!config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) 30359702c686SJanusz Dziedzic return; 30369702c686SJanusz Dziedzic 30379702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, pulses_total); 30389702c686SJanusz Dziedzic 30399702c686SJanusz Dziedzic while (i < buf_len) { 30409702c686SJanusz Dziedzic if (i + sizeof(*tlv) > buf_len) { 30417aa7a72aSMichal Kazior ath10k_warn(ar, "too short buf for tlv header (%d)\n", 30427aa7a72aSMichal Kazior i); 30439702c686SJanusz Dziedzic return; 30449702c686SJanusz Dziedzic } 30459702c686SJanusz Dziedzic 30462332d0aeSMichal Kazior tlv = (struct phyerr_tlv *)&phyerr->buf[i]; 30479702c686SJanusz Dziedzic tlv_len = __le16_to_cpu(tlv->len); 30482332d0aeSMichal Kazior tlv_buf = &phyerr->buf[i + sizeof(*tlv)]; 30497aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 30509702c686SJanusz Dziedzic "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n", 30519702c686SJanusz Dziedzic tlv_len, tlv->tag, tlv->sig); 30529702c686SJanusz Dziedzic 30539702c686SJanusz Dziedzic switch (tlv->tag) { 30549702c686SJanusz Dziedzic case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY: 30559702c686SJanusz Dziedzic if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) { 30567aa7a72aSMichal Kazior ath10k_warn(ar, "too short radar pulse summary (%d)\n", 30579702c686SJanusz Dziedzic i); 30589702c686SJanusz Dziedzic return; 30599702c686SJanusz Dziedzic } 30609702c686SJanusz Dziedzic 30619702c686SJanusz Dziedzic rr = (struct phyerr_radar_report *)tlv_buf; 30622332d0aeSMichal Kazior ath10k_dfs_radar_report(ar, phyerr, rr, tsf); 30639702c686SJanusz Dziedzic break; 30649702c686SJanusz Dziedzic case PHYERR_TLV_TAG_SEARCH_FFT_REPORT: 30659702c686SJanusz Dziedzic if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) { 30667aa7a72aSMichal Kazior ath10k_warn(ar, "too short fft report (%d)\n", 30677aa7a72aSMichal Kazior i); 30689702c686SJanusz Dziedzic return; 30699702c686SJanusz Dziedzic } 30709702c686SJanusz Dziedzic 30719702c686SJanusz Dziedzic fftr = (struct phyerr_fft_report *)tlv_buf; 30722332d0aeSMichal Kazior res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf); 30739702c686SJanusz Dziedzic if (res) 30749702c686SJanusz Dziedzic return; 30759702c686SJanusz Dziedzic break; 30769702c686SJanusz Dziedzic } 30779702c686SJanusz Dziedzic 30789702c686SJanusz Dziedzic i += sizeof(*tlv) + tlv_len; 30799702c686SJanusz Dziedzic } 30809702c686SJanusz Dziedzic } 30819702c686SJanusz Dziedzic 30820226d602SMichal Kazior void ath10k_wmi_event_spectral_scan(struct ath10k *ar, 30832332d0aeSMichal Kazior const struct wmi_phyerr *phyerr, 30849702c686SJanusz Dziedzic u64 tsf) 30859702c686SJanusz Dziedzic { 3086855aed12SSimon Wunderlich int buf_len, tlv_len, res, i = 0; 3087855aed12SSimon Wunderlich struct phyerr_tlv *tlv; 30882332d0aeSMichal Kazior const void *tlv_buf; 30892332d0aeSMichal Kazior const struct phyerr_fft_report *fftr; 3090855aed12SSimon Wunderlich size_t fftr_len; 3091855aed12SSimon Wunderlich 30922332d0aeSMichal Kazior buf_len = __le32_to_cpu(phyerr->buf_len); 3093855aed12SSimon Wunderlich 3094855aed12SSimon Wunderlich while (i < buf_len) { 3095855aed12SSimon Wunderlich if (i + sizeof(*tlv) > buf_len) { 30967aa7a72aSMichal Kazior ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n", 3097855aed12SSimon Wunderlich i); 3098855aed12SSimon Wunderlich return; 3099855aed12SSimon Wunderlich } 3100855aed12SSimon Wunderlich 31012332d0aeSMichal Kazior tlv = (struct phyerr_tlv *)&phyerr->buf[i]; 3102855aed12SSimon Wunderlich tlv_len = __le16_to_cpu(tlv->len); 31032332d0aeSMichal Kazior tlv_buf = &phyerr->buf[i + sizeof(*tlv)]; 3104855aed12SSimon Wunderlich 3105855aed12SSimon Wunderlich if (i + sizeof(*tlv) + tlv_len > buf_len) { 31067aa7a72aSMichal Kazior ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n", 3107855aed12SSimon Wunderlich i); 3108855aed12SSimon Wunderlich return; 3109855aed12SSimon Wunderlich } 3110855aed12SSimon Wunderlich 3111855aed12SSimon Wunderlich switch (tlv->tag) { 3112855aed12SSimon Wunderlich case PHYERR_TLV_TAG_SEARCH_FFT_REPORT: 3113855aed12SSimon Wunderlich if (sizeof(*fftr) > tlv_len) { 31147aa7a72aSMichal Kazior ath10k_warn(ar, "failed to parse fft report at byte %d\n", 3115855aed12SSimon Wunderlich i); 3116855aed12SSimon Wunderlich return; 3117855aed12SSimon Wunderlich } 3118855aed12SSimon Wunderlich 3119855aed12SSimon Wunderlich fftr_len = tlv_len - sizeof(*fftr); 31202332d0aeSMichal Kazior fftr = tlv_buf; 31212332d0aeSMichal Kazior res = ath10k_spectral_process_fft(ar, phyerr, 3122855aed12SSimon Wunderlich fftr, fftr_len, 3123855aed12SSimon Wunderlich tsf); 3124855aed12SSimon Wunderlich if (res < 0) { 31257aa7a72aSMichal Kazior ath10k_warn(ar, "failed to process fft report: %d\n", 3126855aed12SSimon Wunderlich res); 3127855aed12SSimon Wunderlich return; 3128855aed12SSimon Wunderlich } 3129855aed12SSimon Wunderlich break; 3130855aed12SSimon Wunderlich } 3131855aed12SSimon Wunderlich 3132855aed12SSimon Wunderlich i += sizeof(*tlv) + tlv_len; 3133855aed12SSimon Wunderlich } 31349702c686SJanusz Dziedzic } 31359702c686SJanusz Dziedzic 3136d7579d12SMichal Kazior static int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar, struct sk_buff *skb, 313732653cf1SMichal Kazior struct wmi_phyerr_ev_arg *arg) 313832653cf1SMichal Kazior { 313932653cf1SMichal Kazior struct wmi_phyerr_event *ev = (void *)skb->data; 314032653cf1SMichal Kazior 314132653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 314232653cf1SMichal Kazior return -EPROTO; 314332653cf1SMichal Kazior 314432653cf1SMichal Kazior arg->num_phyerrs = ev->num_phyerrs; 314532653cf1SMichal Kazior arg->tsf_l32 = ev->tsf_l32; 314632653cf1SMichal Kazior arg->tsf_u32 = ev->tsf_u32; 314732653cf1SMichal Kazior arg->buf_len = __cpu_to_le32(skb->len - sizeof(*ev)); 314832653cf1SMichal Kazior arg->phyerrs = ev->phyerrs; 314932653cf1SMichal Kazior 315032653cf1SMichal Kazior return 0; 315132653cf1SMichal Kazior } 315232653cf1SMichal Kazior 31530226d602SMichal Kazior void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb) 31545e3dd157SKalle Valo { 315532653cf1SMichal Kazior struct wmi_phyerr_ev_arg arg = {}; 31562332d0aeSMichal Kazior const struct wmi_phyerr *phyerr; 31579702c686SJanusz Dziedzic u32 count, i, buf_len, phy_err_code; 31589702c686SJanusz Dziedzic u64 tsf; 315932653cf1SMichal Kazior int left_len, ret; 31609702c686SJanusz Dziedzic 31619702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, phy_errors); 31629702c686SJanusz Dziedzic 3163d7579d12SMichal Kazior ret = ath10k_wmi_pull_phyerr(ar, skb, &arg); 316432653cf1SMichal Kazior if (ret) { 316532653cf1SMichal Kazior ath10k_warn(ar, "failed to parse phyerr event: %d\n", ret); 31669702c686SJanusz Dziedzic return; 31679702c686SJanusz Dziedzic } 31689702c686SJanusz Dziedzic 316932653cf1SMichal Kazior left_len = __le32_to_cpu(arg.buf_len); 31709702c686SJanusz Dziedzic 31719702c686SJanusz Dziedzic /* Check number of included events */ 317232653cf1SMichal Kazior count = __le32_to_cpu(arg.num_phyerrs); 31739702c686SJanusz Dziedzic 317432653cf1SMichal Kazior tsf = __le32_to_cpu(arg.tsf_u32); 31759702c686SJanusz Dziedzic tsf <<= 32; 317632653cf1SMichal Kazior tsf |= __le32_to_cpu(arg.tsf_l32); 31779702c686SJanusz Dziedzic 31787aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 31799702c686SJanusz Dziedzic "wmi event phyerr count %d tsf64 0x%llX\n", 31809702c686SJanusz Dziedzic count, tsf); 31819702c686SJanusz Dziedzic 318232653cf1SMichal Kazior phyerr = arg.phyerrs; 31839702c686SJanusz Dziedzic for (i = 0; i < count; i++) { 31849702c686SJanusz Dziedzic /* Check if we can read event header */ 31852332d0aeSMichal Kazior if (left_len < sizeof(*phyerr)) { 31867aa7a72aSMichal Kazior ath10k_warn(ar, "single event (%d) wrong head len\n", 31877aa7a72aSMichal Kazior i); 31889702c686SJanusz Dziedzic return; 31899702c686SJanusz Dziedzic } 31909702c686SJanusz Dziedzic 31912332d0aeSMichal Kazior left_len -= sizeof(*phyerr); 31929702c686SJanusz Dziedzic 31932332d0aeSMichal Kazior buf_len = __le32_to_cpu(phyerr->buf_len); 31942332d0aeSMichal Kazior phy_err_code = phyerr->phy_err_code; 31959702c686SJanusz Dziedzic 31969702c686SJanusz Dziedzic if (left_len < buf_len) { 31977aa7a72aSMichal Kazior ath10k_warn(ar, "single event (%d) wrong buf len\n", i); 31989702c686SJanusz Dziedzic return; 31999702c686SJanusz Dziedzic } 32009702c686SJanusz Dziedzic 32019702c686SJanusz Dziedzic left_len -= buf_len; 32029702c686SJanusz Dziedzic 32039702c686SJanusz Dziedzic switch (phy_err_code) { 32049702c686SJanusz Dziedzic case PHY_ERROR_RADAR: 32052332d0aeSMichal Kazior ath10k_wmi_event_dfs(ar, phyerr, tsf); 32069702c686SJanusz Dziedzic break; 32079702c686SJanusz Dziedzic case PHY_ERROR_SPECTRAL_SCAN: 32082332d0aeSMichal Kazior ath10k_wmi_event_spectral_scan(ar, phyerr, tsf); 32099702c686SJanusz Dziedzic break; 32109702c686SJanusz Dziedzic case PHY_ERROR_FALSE_RADAR_EXT: 32112332d0aeSMichal Kazior ath10k_wmi_event_dfs(ar, phyerr, tsf); 32122332d0aeSMichal Kazior ath10k_wmi_event_spectral_scan(ar, phyerr, tsf); 32139702c686SJanusz Dziedzic break; 32149702c686SJanusz Dziedzic default: 32159702c686SJanusz Dziedzic break; 32169702c686SJanusz Dziedzic } 32179702c686SJanusz Dziedzic 32182332d0aeSMichal Kazior phyerr = (void *)phyerr + sizeof(*phyerr) + buf_len; 32199702c686SJanusz Dziedzic } 32205e3dd157SKalle Valo } 32215e3dd157SKalle Valo 32220226d602SMichal Kazior void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb) 32235e3dd157SKalle Valo { 3224c1a4654aSMichal Kazior struct wmi_roam_ev_arg arg = {}; 3225c1a4654aSMichal Kazior int ret; 3226c1a4654aSMichal Kazior u32 vdev_id; 3227c1a4654aSMichal Kazior u32 reason; 3228c1a4654aSMichal Kazior s32 rssi; 3229c1a4654aSMichal Kazior 3230c1a4654aSMichal Kazior ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg); 3231c1a4654aSMichal Kazior if (ret) { 3232c1a4654aSMichal Kazior ath10k_warn(ar, "failed to parse roam event: %d\n", ret); 3233c1a4654aSMichal Kazior return; 3234c1a4654aSMichal Kazior } 3235c1a4654aSMichal Kazior 3236c1a4654aSMichal Kazior vdev_id = __le32_to_cpu(arg.vdev_id); 3237c1a4654aSMichal Kazior reason = __le32_to_cpu(arg.reason); 3238c1a4654aSMichal Kazior rssi = __le32_to_cpu(arg.rssi); 3239c1a4654aSMichal Kazior rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT; 3240c1a4654aSMichal Kazior 3241c1a4654aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 3242c1a4654aSMichal Kazior "wmi roam event vdev %u reason 0x%08x rssi %d\n", 3243c1a4654aSMichal Kazior vdev_id, reason, rssi); 3244c1a4654aSMichal Kazior 3245c1a4654aSMichal Kazior if (reason >= WMI_ROAM_REASON_MAX) 3246c1a4654aSMichal Kazior ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n", 3247c1a4654aSMichal Kazior reason, vdev_id); 3248c1a4654aSMichal Kazior 3249c1a4654aSMichal Kazior switch (reason) { 3250c1a4654aSMichal Kazior case WMI_ROAM_REASON_BEACON_MISS: 3251cc9904e6SMichal Kazior ath10k_mac_handle_beacon_miss(ar, vdev_id); 3252cc9904e6SMichal Kazior break; 3253cc9904e6SMichal Kazior case WMI_ROAM_REASON_BETTER_AP: 3254c1a4654aSMichal Kazior case WMI_ROAM_REASON_LOW_RSSI: 3255c1a4654aSMichal Kazior case WMI_ROAM_REASON_SUITABLE_AP_FOUND: 3256c1a4654aSMichal Kazior case WMI_ROAM_REASON_HO_FAILED: 3257c1a4654aSMichal Kazior ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n", 3258c1a4654aSMichal Kazior reason, vdev_id); 3259c1a4654aSMichal Kazior break; 3260c1a4654aSMichal Kazior } 32615e3dd157SKalle Valo } 32625e3dd157SKalle Valo 32630226d602SMichal Kazior void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb) 32645e3dd157SKalle Valo { 32657aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n"); 32665e3dd157SKalle Valo } 32675e3dd157SKalle Valo 32680226d602SMichal Kazior void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb) 32695e3dd157SKalle Valo { 32702fe5288cSKalle Valo char buf[101], c; 32712fe5288cSKalle Valo int i; 32722fe5288cSKalle Valo 32732fe5288cSKalle Valo for (i = 0; i < sizeof(buf) - 1; i++) { 32742fe5288cSKalle Valo if (i >= skb->len) 32752fe5288cSKalle Valo break; 32762fe5288cSKalle Valo 32772fe5288cSKalle Valo c = skb->data[i]; 32782fe5288cSKalle Valo 32792fe5288cSKalle Valo if (c == '\0') 32802fe5288cSKalle Valo break; 32812fe5288cSKalle Valo 32822fe5288cSKalle Valo if (isascii(c) && isprint(c)) 32832fe5288cSKalle Valo buf[i] = c; 32842fe5288cSKalle Valo else 32852fe5288cSKalle Valo buf[i] = '.'; 32862fe5288cSKalle Valo } 32872fe5288cSKalle Valo 32882fe5288cSKalle Valo if (i == sizeof(buf) - 1) 32897aa7a72aSMichal Kazior ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len); 32902fe5288cSKalle Valo 32912fe5288cSKalle Valo /* for some reason the debug prints end with \n, remove that */ 32922fe5288cSKalle Valo if (skb->data[i - 1] == '\n') 32932fe5288cSKalle Valo i--; 32942fe5288cSKalle Valo 32952fe5288cSKalle Valo /* the last byte is always reserved for the null character */ 32962fe5288cSKalle Valo buf[i] = '\0'; 32972fe5288cSKalle Valo 32983be004c3SBen Greear ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf); 32995e3dd157SKalle Valo } 33005e3dd157SKalle Valo 33010226d602SMichal Kazior void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb) 33025e3dd157SKalle Valo { 33037aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n"); 33045e3dd157SKalle Valo } 33055e3dd157SKalle Valo 33060226d602SMichal Kazior void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb) 33075e3dd157SKalle Valo { 33087aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n"); 33095e3dd157SKalle Valo } 33105e3dd157SKalle Valo 33110226d602SMichal Kazior void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar, 33125e3dd157SKalle Valo struct sk_buff *skb) 33135e3dd157SKalle Valo { 33147aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n"); 33155e3dd157SKalle Valo } 33165e3dd157SKalle Valo 33170226d602SMichal Kazior void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar, 33185e3dd157SKalle Valo struct sk_buff *skb) 33195e3dd157SKalle Valo { 33207aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n"); 33215e3dd157SKalle Valo } 33225e3dd157SKalle Valo 33230226d602SMichal Kazior void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb) 33245e3dd157SKalle Valo { 33257aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n"); 33265e3dd157SKalle Valo } 33275e3dd157SKalle Valo 33280226d602SMichal Kazior void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb) 33295e3dd157SKalle Valo { 33305fd3ac3cSJanusz Dziedzic struct wmi_wow_ev_arg ev = {}; 33315fd3ac3cSJanusz Dziedzic int ret; 33325fd3ac3cSJanusz Dziedzic 33335fd3ac3cSJanusz Dziedzic complete(&ar->wow.wakeup_completed); 33345fd3ac3cSJanusz Dziedzic 33355fd3ac3cSJanusz Dziedzic ret = ath10k_wmi_pull_wow_event(ar, skb, &ev); 33365fd3ac3cSJanusz Dziedzic if (ret) { 33375fd3ac3cSJanusz Dziedzic ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret); 33385fd3ac3cSJanusz Dziedzic return; 33395fd3ac3cSJanusz Dziedzic } 33405fd3ac3cSJanusz Dziedzic 33415fd3ac3cSJanusz Dziedzic ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n", 33425fd3ac3cSJanusz Dziedzic wow_reason(ev.wake_reason)); 33435e3dd157SKalle Valo } 33445e3dd157SKalle Valo 33450226d602SMichal Kazior void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb) 33465e3dd157SKalle Valo { 33477aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n"); 33485e3dd157SKalle Valo } 33495e3dd157SKalle Valo 33500226d602SMichal Kazior void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb) 33515e3dd157SKalle Valo { 33527aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_TPC_CONFIG_EVENTID\n"); 33535e3dd157SKalle Valo } 33545e3dd157SKalle Valo 33550226d602SMichal Kazior void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb) 33565e3dd157SKalle Valo { 33577aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n"); 33585e3dd157SKalle Valo } 33595e3dd157SKalle Valo 33600226d602SMichal Kazior void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb) 33615e3dd157SKalle Valo { 33627aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n"); 33635e3dd157SKalle Valo } 33645e3dd157SKalle Valo 33650226d602SMichal Kazior void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb) 33665e3dd157SKalle Valo { 33677aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n"); 33685e3dd157SKalle Valo } 33695e3dd157SKalle Valo 33700226d602SMichal Kazior void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb) 33715e3dd157SKalle Valo { 33727aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n"); 33735e3dd157SKalle Valo } 33745e3dd157SKalle Valo 33750226d602SMichal Kazior void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb) 33765e3dd157SKalle Valo { 33777aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n"); 33785e3dd157SKalle Valo } 33795e3dd157SKalle Valo 33800226d602SMichal Kazior void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar, 33815e3dd157SKalle Valo struct sk_buff *skb) 33825e3dd157SKalle Valo { 33837aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n"); 33845e3dd157SKalle Valo } 33855e3dd157SKalle Valo 33860226d602SMichal Kazior void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb) 33878a6618b0SBartosz Markowski { 33887aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n"); 33898a6618b0SBartosz Markowski } 33908a6618b0SBartosz Markowski 33910226d602SMichal Kazior void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb) 33928a6618b0SBartosz Markowski { 33937aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n"); 33948a6618b0SBartosz Markowski } 33958a6618b0SBartosz Markowski 33960226d602SMichal Kazior void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb) 33978a6618b0SBartosz Markowski { 33987aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n"); 33998a6618b0SBartosz Markowski } 34008a6618b0SBartosz Markowski 3401b3effe61SBartosz Markowski static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id, 3402b3effe61SBartosz Markowski u32 num_units, u32 unit_len) 3403b3effe61SBartosz Markowski { 3404b3effe61SBartosz Markowski dma_addr_t paddr; 3405b3effe61SBartosz Markowski u32 pool_size; 3406b3effe61SBartosz Markowski int idx = ar->wmi.num_mem_chunks; 3407b3effe61SBartosz Markowski 3408b3effe61SBartosz Markowski pool_size = num_units * round_up(unit_len, 4); 3409b3effe61SBartosz Markowski 3410b3effe61SBartosz Markowski if (!pool_size) 3411b3effe61SBartosz Markowski return -EINVAL; 3412b3effe61SBartosz Markowski 3413b3effe61SBartosz Markowski ar->wmi.mem_chunks[idx].vaddr = dma_alloc_coherent(ar->dev, 3414b3effe61SBartosz Markowski pool_size, 3415b3effe61SBartosz Markowski &paddr, 3416b3effe61SBartosz Markowski GFP_ATOMIC); 3417b3effe61SBartosz Markowski if (!ar->wmi.mem_chunks[idx].vaddr) { 34187aa7a72aSMichal Kazior ath10k_warn(ar, "failed to allocate memory chunk\n"); 3419b3effe61SBartosz Markowski return -ENOMEM; 3420b3effe61SBartosz Markowski } 3421b3effe61SBartosz Markowski 3422b3effe61SBartosz Markowski memset(ar->wmi.mem_chunks[idx].vaddr, 0, pool_size); 3423b3effe61SBartosz Markowski 3424b3effe61SBartosz Markowski ar->wmi.mem_chunks[idx].paddr = paddr; 3425b3effe61SBartosz Markowski ar->wmi.mem_chunks[idx].len = pool_size; 3426b3effe61SBartosz Markowski ar->wmi.mem_chunks[idx].req_id = req_id; 3427b3effe61SBartosz Markowski ar->wmi.num_mem_chunks++; 3428b3effe61SBartosz Markowski 3429b3effe61SBartosz Markowski return 0; 3430b3effe61SBartosz Markowski } 3431b3effe61SBartosz Markowski 3432d7579d12SMichal Kazior static int 3433d7579d12SMichal Kazior ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 34345c01aa3dSMichal Kazior struct wmi_svc_rdy_ev_arg *arg) 34355c01aa3dSMichal Kazior { 34365c01aa3dSMichal Kazior struct wmi_service_ready_event *ev; 34375c01aa3dSMichal Kazior size_t i, n; 34385c01aa3dSMichal Kazior 34395c01aa3dSMichal Kazior if (skb->len < sizeof(*ev)) 34405c01aa3dSMichal Kazior return -EPROTO; 34415c01aa3dSMichal Kazior 34425c01aa3dSMichal Kazior ev = (void *)skb->data; 34435c01aa3dSMichal Kazior skb_pull(skb, sizeof(*ev)); 34445c01aa3dSMichal Kazior arg->min_tx_power = ev->hw_min_tx_power; 34455c01aa3dSMichal Kazior arg->max_tx_power = ev->hw_max_tx_power; 34465c01aa3dSMichal Kazior arg->ht_cap = ev->ht_cap_info; 34475c01aa3dSMichal Kazior arg->vht_cap = ev->vht_cap_info; 34485c01aa3dSMichal Kazior arg->sw_ver0 = ev->sw_version; 34495c01aa3dSMichal Kazior arg->sw_ver1 = ev->sw_version_1; 34505c01aa3dSMichal Kazior arg->phy_capab = ev->phy_capability; 34515c01aa3dSMichal Kazior arg->num_rf_chains = ev->num_rf_chains; 34525c01aa3dSMichal Kazior arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd; 34535c01aa3dSMichal Kazior arg->num_mem_reqs = ev->num_mem_reqs; 34545c01aa3dSMichal Kazior arg->service_map = ev->wmi_service_bitmap; 34552a3e60d3SMichal Kazior arg->service_map_len = sizeof(ev->wmi_service_bitmap); 34565c01aa3dSMichal Kazior 34575c01aa3dSMichal Kazior n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs), 34585c01aa3dSMichal Kazior ARRAY_SIZE(arg->mem_reqs)); 34595c01aa3dSMichal Kazior for (i = 0; i < n; i++) 34605c01aa3dSMichal Kazior arg->mem_reqs[i] = &ev->mem_reqs[i]; 34615c01aa3dSMichal Kazior 34625c01aa3dSMichal Kazior if (skb->len < 34635c01aa3dSMichal Kazior __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0])) 34645c01aa3dSMichal Kazior return -EPROTO; 34655c01aa3dSMichal Kazior 34665c01aa3dSMichal Kazior return 0; 34675c01aa3dSMichal Kazior } 34685c01aa3dSMichal Kazior 3469d7579d12SMichal Kazior static int 3470d7579d12SMichal Kazior ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 34715c01aa3dSMichal Kazior struct wmi_svc_rdy_ev_arg *arg) 34725c01aa3dSMichal Kazior { 34735c01aa3dSMichal Kazior struct wmi_10x_service_ready_event *ev; 34745c01aa3dSMichal Kazior int i, n; 34755c01aa3dSMichal Kazior 34765c01aa3dSMichal Kazior if (skb->len < sizeof(*ev)) 34775c01aa3dSMichal Kazior return -EPROTO; 34785c01aa3dSMichal Kazior 34795c01aa3dSMichal Kazior ev = (void *)skb->data; 34805c01aa3dSMichal Kazior skb_pull(skb, sizeof(*ev)); 34815c01aa3dSMichal Kazior arg->min_tx_power = ev->hw_min_tx_power; 34825c01aa3dSMichal Kazior arg->max_tx_power = ev->hw_max_tx_power; 34835c01aa3dSMichal Kazior arg->ht_cap = ev->ht_cap_info; 34845c01aa3dSMichal Kazior arg->vht_cap = ev->vht_cap_info; 34855c01aa3dSMichal Kazior arg->sw_ver0 = ev->sw_version; 34865c01aa3dSMichal Kazior arg->phy_capab = ev->phy_capability; 34875c01aa3dSMichal Kazior arg->num_rf_chains = ev->num_rf_chains; 34885c01aa3dSMichal Kazior arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd; 34895c01aa3dSMichal Kazior arg->num_mem_reqs = ev->num_mem_reqs; 34905c01aa3dSMichal Kazior arg->service_map = ev->wmi_service_bitmap; 34912a3e60d3SMichal Kazior arg->service_map_len = sizeof(ev->wmi_service_bitmap); 34925c01aa3dSMichal Kazior 34935c01aa3dSMichal Kazior n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs), 34945c01aa3dSMichal Kazior ARRAY_SIZE(arg->mem_reqs)); 34955c01aa3dSMichal Kazior for (i = 0; i < n; i++) 34965c01aa3dSMichal Kazior arg->mem_reqs[i] = &ev->mem_reqs[i]; 34975c01aa3dSMichal Kazior 34985c01aa3dSMichal Kazior if (skb->len < 34995c01aa3dSMichal Kazior __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0])) 35005c01aa3dSMichal Kazior return -EPROTO; 35015c01aa3dSMichal Kazior 35025c01aa3dSMichal Kazior return 0; 35035c01aa3dSMichal Kazior } 35045c01aa3dSMichal Kazior 35050226d602SMichal Kazior void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb) 35065e3dd157SKalle Valo { 35075c01aa3dSMichal Kazior struct wmi_svc_rdy_ev_arg arg = {}; 35085c01aa3dSMichal Kazior u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i; 35095c01aa3dSMichal Kazior int ret; 35105e3dd157SKalle Valo 3511d7579d12SMichal Kazior ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg); 35125c01aa3dSMichal Kazior if (ret) { 35135c01aa3dSMichal Kazior ath10k_warn(ar, "failed to parse service ready: %d\n", ret); 35145e3dd157SKalle Valo return; 35155e3dd157SKalle Valo } 35165e3dd157SKalle Valo 3517d7579d12SMichal Kazior memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map)); 3518d7579d12SMichal Kazior ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map, 3519d7579d12SMichal Kazior arg.service_map_len); 3520d7579d12SMichal Kazior 35215c01aa3dSMichal Kazior ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power); 35225c01aa3dSMichal Kazior ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power); 35235c01aa3dSMichal Kazior ar->ht_cap_info = __le32_to_cpu(arg.ht_cap); 35245c01aa3dSMichal Kazior ar->vht_cap_info = __le32_to_cpu(arg.vht_cap); 35255e3dd157SKalle Valo ar->fw_version_major = 35265c01aa3dSMichal Kazior (__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24; 35275c01aa3dSMichal Kazior ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff); 35285e3dd157SKalle Valo ar->fw_version_release = 35295c01aa3dSMichal Kazior (__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16; 35305c01aa3dSMichal Kazior ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff); 35315c01aa3dSMichal Kazior ar->phy_capability = __le32_to_cpu(arg.phy_capab); 35325c01aa3dSMichal Kazior ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains); 35335c01aa3dSMichal Kazior ar->ath_common.regulatory.current_rd = __le32_to_cpu(arg.eeprom_rd); 35345c01aa3dSMichal Kazior 35355c01aa3dSMichal Kazior ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ", 35362a3e60d3SMichal Kazior arg.service_map, arg.service_map_len); 35378865bee4SMichal Kazior 35381a222435SKalle Valo /* only manually set fw features when not using FW IE format */ 35391a222435SKalle Valo if (ar->fw_api == 1 && ar->fw_version_build > 636) 35400d9b0438SMichal Kazior set_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features); 35410d9b0438SMichal Kazior 35428865bee4SMichal Kazior if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) { 35437aa7a72aSMichal Kazior ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n", 35448865bee4SMichal Kazior ar->num_rf_chains, WMI_MAX_SPATIAL_STREAM); 35458865bee4SMichal Kazior ar->num_rf_chains = WMI_MAX_SPATIAL_STREAM; 35468865bee4SMichal Kazior } 35475e3dd157SKalle Valo 3548fdb959c7SMichal Kazior ar->supp_tx_chainmask = (1 << ar->num_rf_chains) - 1; 3549fdb959c7SMichal Kazior ar->supp_rx_chainmask = (1 << ar->num_rf_chains) - 1; 3550fdb959c7SMichal Kazior 35515e3dd157SKalle Valo if (strlen(ar->hw->wiphy->fw_version) == 0) { 35525e3dd157SKalle Valo snprintf(ar->hw->wiphy->fw_version, 35535e3dd157SKalle Valo sizeof(ar->hw->wiphy->fw_version), 35545e3dd157SKalle Valo "%u.%u.%u.%u", 35555e3dd157SKalle Valo ar->fw_version_major, 35565e3dd157SKalle Valo ar->fw_version_minor, 35575e3dd157SKalle Valo ar->fw_version_release, 35585e3dd157SKalle Valo ar->fw_version_build); 35595e3dd157SKalle Valo } 35605e3dd157SKalle Valo 35615c01aa3dSMichal Kazior num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs); 35625c01aa3dSMichal Kazior if (num_mem_reqs > WMI_MAX_MEM_REQS) { 35637aa7a72aSMichal Kazior ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n", 3564b3effe61SBartosz Markowski num_mem_reqs); 3565b3effe61SBartosz Markowski return; 35666f97d256SBartosz Markowski } 35676f97d256SBartosz Markowski 3568b3effe61SBartosz Markowski for (i = 0; i < num_mem_reqs; ++i) { 35695c01aa3dSMichal Kazior req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id); 35705c01aa3dSMichal Kazior num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units); 35715c01aa3dSMichal Kazior unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size); 35725c01aa3dSMichal Kazior num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info); 3573b3effe61SBartosz Markowski 3574b3effe61SBartosz Markowski if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) 3575b3effe61SBartosz Markowski /* number of units to allocate is number of 3576b3effe61SBartosz Markowski * peers, 1 extra for self peer on target */ 3577b3effe61SBartosz Markowski /* this needs to be tied, host and target 3578b3effe61SBartosz Markowski * can get out of sync */ 3579ec6a73f0SBartosz Markowski num_units = TARGET_10X_NUM_PEERS + 1; 3580b3effe61SBartosz Markowski else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) 3581ec6a73f0SBartosz Markowski num_units = TARGET_10X_NUM_VDEVS + 1; 3582b3effe61SBartosz Markowski 35837aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 3584b3effe61SBartosz Markowski "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n", 3585b3effe61SBartosz Markowski req_id, 35865c01aa3dSMichal Kazior __le32_to_cpu(arg.mem_reqs[i]->num_units), 3587b3effe61SBartosz Markowski num_unit_info, 3588b3effe61SBartosz Markowski unit_size, 3589b3effe61SBartosz Markowski num_units); 3590b3effe61SBartosz Markowski 3591b3effe61SBartosz Markowski ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units, 3592b3effe61SBartosz Markowski unit_size); 3593b3effe61SBartosz Markowski if (ret) 3594b3effe61SBartosz Markowski return; 3595b3effe61SBartosz Markowski } 3596b3effe61SBartosz Markowski 35977aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 3598ca996ec5SMichal Kazior "wmi event service ready min_tx_power 0x%08x max_tx_power 0x%08x ht_cap 0x%08x vht_cap 0x%08x sw_ver0 0x%08x sw_ver1 0x%08x fw_build 0x%08x phy_capab 0x%08x num_rf_chains 0x%08x eeprom_rd 0x%08x num_mem_reqs 0x%08x\n", 35995c01aa3dSMichal Kazior __le32_to_cpu(arg.min_tx_power), 36005c01aa3dSMichal Kazior __le32_to_cpu(arg.max_tx_power), 36015c01aa3dSMichal Kazior __le32_to_cpu(arg.ht_cap), 36025c01aa3dSMichal Kazior __le32_to_cpu(arg.vht_cap), 36035c01aa3dSMichal Kazior __le32_to_cpu(arg.sw_ver0), 36045c01aa3dSMichal Kazior __le32_to_cpu(arg.sw_ver1), 3605ca996ec5SMichal Kazior __le32_to_cpu(arg.fw_build), 36065c01aa3dSMichal Kazior __le32_to_cpu(arg.phy_capab), 36075c01aa3dSMichal Kazior __le32_to_cpu(arg.num_rf_chains), 36085c01aa3dSMichal Kazior __le32_to_cpu(arg.eeprom_rd), 36095c01aa3dSMichal Kazior __le32_to_cpu(arg.num_mem_reqs)); 36106f97d256SBartosz Markowski 36116f97d256SBartosz Markowski complete(&ar->wmi.service_ready); 36126f97d256SBartosz Markowski } 36136f97d256SBartosz Markowski 3614d7579d12SMichal Kazior static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 361532653cf1SMichal Kazior struct wmi_rdy_ev_arg *arg) 361632653cf1SMichal Kazior { 361732653cf1SMichal Kazior struct wmi_ready_event *ev = (void *)skb->data; 361832653cf1SMichal Kazior 361932653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 362032653cf1SMichal Kazior return -EPROTO; 362132653cf1SMichal Kazior 362232653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 362332653cf1SMichal Kazior arg->sw_version = ev->sw_version; 362432653cf1SMichal Kazior arg->abi_version = ev->abi_version; 362532653cf1SMichal Kazior arg->status = ev->status; 362632653cf1SMichal Kazior arg->mac_addr = ev->mac_addr.addr; 362732653cf1SMichal Kazior 362832653cf1SMichal Kazior return 0; 362932653cf1SMichal Kazior } 363032653cf1SMichal Kazior 3631c1a4654aSMichal Kazior static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb, 3632c1a4654aSMichal Kazior struct wmi_roam_ev_arg *arg) 3633c1a4654aSMichal Kazior { 3634c1a4654aSMichal Kazior struct wmi_roam_ev *ev = (void *)skb->data; 3635c1a4654aSMichal Kazior 3636c1a4654aSMichal Kazior if (skb->len < sizeof(*ev)) 3637c1a4654aSMichal Kazior return -EPROTO; 3638c1a4654aSMichal Kazior 3639c1a4654aSMichal Kazior skb_pull(skb, sizeof(*ev)); 3640c1a4654aSMichal Kazior arg->vdev_id = ev->vdev_id; 3641c1a4654aSMichal Kazior arg->reason = ev->reason; 3642c1a4654aSMichal Kazior 3643c1a4654aSMichal Kazior return 0; 3644c1a4654aSMichal Kazior } 3645c1a4654aSMichal Kazior 36460226d602SMichal Kazior int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb) 36475e3dd157SKalle Valo { 364832653cf1SMichal Kazior struct wmi_rdy_ev_arg arg = {}; 364932653cf1SMichal Kazior int ret; 36505e3dd157SKalle Valo 3651d7579d12SMichal Kazior ret = ath10k_wmi_pull_rdy(ar, skb, &arg); 365232653cf1SMichal Kazior if (ret) { 365332653cf1SMichal Kazior ath10k_warn(ar, "failed to parse ready event: %d\n", ret); 365432653cf1SMichal Kazior return ret; 365532653cf1SMichal Kazior } 36565e3dd157SKalle Valo 36577aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 365832653cf1SMichal Kazior "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n", 365932653cf1SMichal Kazior __le32_to_cpu(arg.sw_version), 366032653cf1SMichal Kazior __le32_to_cpu(arg.abi_version), 366132653cf1SMichal Kazior arg.mac_addr, 366232653cf1SMichal Kazior __le32_to_cpu(arg.status)); 36635e3dd157SKalle Valo 366432653cf1SMichal Kazior ether_addr_copy(ar->mac_addr, arg.mac_addr); 36655e3dd157SKalle Valo complete(&ar->wmi.unified_ready); 36665e3dd157SKalle Valo return 0; 36675e3dd157SKalle Valo } 36685e3dd157SKalle Valo 3669a57a6a27SRajkumar Manoharan static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb) 3670a57a6a27SRajkumar Manoharan { 3671a57a6a27SRajkumar Manoharan const struct wmi_pdev_temperature_event *ev; 3672a57a6a27SRajkumar Manoharan 3673a57a6a27SRajkumar Manoharan ev = (struct wmi_pdev_temperature_event *)skb->data; 3674a57a6a27SRajkumar Manoharan if (WARN_ON(skb->len < sizeof(*ev))) 3675a57a6a27SRajkumar Manoharan return -EPROTO; 3676a57a6a27SRajkumar Manoharan 3677ac2953fcSRajkumar Manoharan ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature)); 3678a57a6a27SRajkumar Manoharan return 0; 3679a57a6a27SRajkumar Manoharan } 3680a57a6a27SRajkumar Manoharan 3681d7579d12SMichal Kazior static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb) 36825e3dd157SKalle Valo { 36835e3dd157SKalle Valo struct wmi_cmd_hdr *cmd_hdr; 36845e3dd157SKalle Valo enum wmi_event_id id; 36855e3dd157SKalle Valo 36865e3dd157SKalle Valo cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 36875e3dd157SKalle Valo id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 36885e3dd157SKalle Valo 36895e3dd157SKalle Valo if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 3690469d479fSMichal Kazior goto out; 36915e3dd157SKalle Valo 3692d35a6c18SMichal Kazior trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 36935e3dd157SKalle Valo 36945e3dd157SKalle Valo switch (id) { 36955e3dd157SKalle Valo case WMI_MGMT_RX_EVENTID: 36965e3dd157SKalle Valo ath10k_wmi_event_mgmt_rx(ar, skb); 36975e3dd157SKalle Valo /* mgmt_rx() owns the skb now! */ 36985e3dd157SKalle Valo return; 36995e3dd157SKalle Valo case WMI_SCAN_EVENTID: 37005e3dd157SKalle Valo ath10k_wmi_event_scan(ar, skb); 37015e3dd157SKalle Valo break; 37025e3dd157SKalle Valo case WMI_CHAN_INFO_EVENTID: 37035e3dd157SKalle Valo ath10k_wmi_event_chan_info(ar, skb); 37045e3dd157SKalle Valo break; 37055e3dd157SKalle Valo case WMI_ECHO_EVENTID: 37065e3dd157SKalle Valo ath10k_wmi_event_echo(ar, skb); 37075e3dd157SKalle Valo break; 37085e3dd157SKalle Valo case WMI_DEBUG_MESG_EVENTID: 37095e3dd157SKalle Valo ath10k_wmi_event_debug_mesg(ar, skb); 37105e3dd157SKalle Valo break; 37115e3dd157SKalle Valo case WMI_UPDATE_STATS_EVENTID: 37125e3dd157SKalle Valo ath10k_wmi_event_update_stats(ar, skb); 37135e3dd157SKalle Valo break; 37145e3dd157SKalle Valo case WMI_VDEV_START_RESP_EVENTID: 37155e3dd157SKalle Valo ath10k_wmi_event_vdev_start_resp(ar, skb); 37165e3dd157SKalle Valo break; 37175e3dd157SKalle Valo case WMI_VDEV_STOPPED_EVENTID: 37185e3dd157SKalle Valo ath10k_wmi_event_vdev_stopped(ar, skb); 37195e3dd157SKalle Valo break; 37205e3dd157SKalle Valo case WMI_PEER_STA_KICKOUT_EVENTID: 37215e3dd157SKalle Valo ath10k_wmi_event_peer_sta_kickout(ar, skb); 37225e3dd157SKalle Valo break; 37235e3dd157SKalle Valo case WMI_HOST_SWBA_EVENTID: 37245e3dd157SKalle Valo ath10k_wmi_event_host_swba(ar, skb); 37255e3dd157SKalle Valo break; 37265e3dd157SKalle Valo case WMI_TBTTOFFSET_UPDATE_EVENTID: 37275e3dd157SKalle Valo ath10k_wmi_event_tbttoffset_update(ar, skb); 37285e3dd157SKalle Valo break; 37295e3dd157SKalle Valo case WMI_PHYERR_EVENTID: 37305e3dd157SKalle Valo ath10k_wmi_event_phyerr(ar, skb); 37315e3dd157SKalle Valo break; 37325e3dd157SKalle Valo case WMI_ROAM_EVENTID: 37335e3dd157SKalle Valo ath10k_wmi_event_roam(ar, skb); 37345e3dd157SKalle Valo break; 37355e3dd157SKalle Valo case WMI_PROFILE_MATCH: 37365e3dd157SKalle Valo ath10k_wmi_event_profile_match(ar, skb); 37375e3dd157SKalle Valo break; 37385e3dd157SKalle Valo case WMI_DEBUG_PRINT_EVENTID: 37395e3dd157SKalle Valo ath10k_wmi_event_debug_print(ar, skb); 37405e3dd157SKalle Valo break; 37415e3dd157SKalle Valo case WMI_PDEV_QVIT_EVENTID: 37425e3dd157SKalle Valo ath10k_wmi_event_pdev_qvit(ar, skb); 37435e3dd157SKalle Valo break; 37445e3dd157SKalle Valo case WMI_WLAN_PROFILE_DATA_EVENTID: 37455e3dd157SKalle Valo ath10k_wmi_event_wlan_profile_data(ar, skb); 37465e3dd157SKalle Valo break; 37475e3dd157SKalle Valo case WMI_RTT_MEASUREMENT_REPORT_EVENTID: 37485e3dd157SKalle Valo ath10k_wmi_event_rtt_measurement_report(ar, skb); 37495e3dd157SKalle Valo break; 37505e3dd157SKalle Valo case WMI_TSF_MEASUREMENT_REPORT_EVENTID: 37515e3dd157SKalle Valo ath10k_wmi_event_tsf_measurement_report(ar, skb); 37525e3dd157SKalle Valo break; 37535e3dd157SKalle Valo case WMI_RTT_ERROR_REPORT_EVENTID: 37545e3dd157SKalle Valo ath10k_wmi_event_rtt_error_report(ar, skb); 37555e3dd157SKalle Valo break; 37565e3dd157SKalle Valo case WMI_WOW_WAKEUP_HOST_EVENTID: 37575e3dd157SKalle Valo ath10k_wmi_event_wow_wakeup_host(ar, skb); 37585e3dd157SKalle Valo break; 37595e3dd157SKalle Valo case WMI_DCS_INTERFERENCE_EVENTID: 37605e3dd157SKalle Valo ath10k_wmi_event_dcs_interference(ar, skb); 37615e3dd157SKalle Valo break; 37625e3dd157SKalle Valo case WMI_PDEV_TPC_CONFIG_EVENTID: 37635e3dd157SKalle Valo ath10k_wmi_event_pdev_tpc_config(ar, skb); 37645e3dd157SKalle Valo break; 37655e3dd157SKalle Valo case WMI_PDEV_FTM_INTG_EVENTID: 37665e3dd157SKalle Valo ath10k_wmi_event_pdev_ftm_intg(ar, skb); 37675e3dd157SKalle Valo break; 37685e3dd157SKalle Valo case WMI_GTK_OFFLOAD_STATUS_EVENTID: 37695e3dd157SKalle Valo ath10k_wmi_event_gtk_offload_status(ar, skb); 37705e3dd157SKalle Valo break; 37715e3dd157SKalle Valo case WMI_GTK_REKEY_FAIL_EVENTID: 37725e3dd157SKalle Valo ath10k_wmi_event_gtk_rekey_fail(ar, skb); 37735e3dd157SKalle Valo break; 37745e3dd157SKalle Valo case WMI_TX_DELBA_COMPLETE_EVENTID: 37755e3dd157SKalle Valo ath10k_wmi_event_delba_complete(ar, skb); 37765e3dd157SKalle Valo break; 37775e3dd157SKalle Valo case WMI_TX_ADDBA_COMPLETE_EVENTID: 37785e3dd157SKalle Valo ath10k_wmi_event_addba_complete(ar, skb); 37795e3dd157SKalle Valo break; 37805e3dd157SKalle Valo case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID: 37815e3dd157SKalle Valo ath10k_wmi_event_vdev_install_key_complete(ar, skb); 37825e3dd157SKalle Valo break; 37835e3dd157SKalle Valo case WMI_SERVICE_READY_EVENTID: 3784b34d2b3dSMichal Kazior ath10k_wmi_event_service_ready(ar, skb); 37855e3dd157SKalle Valo break; 37865e3dd157SKalle Valo case WMI_READY_EVENTID: 3787b34d2b3dSMichal Kazior ath10k_wmi_event_ready(ar, skb); 37885e3dd157SKalle Valo break; 37895e3dd157SKalle Valo default: 37907aa7a72aSMichal Kazior ath10k_warn(ar, "Unknown eventid: %d\n", id); 37915e3dd157SKalle Valo break; 37925e3dd157SKalle Valo } 37935e3dd157SKalle Valo 3794469d479fSMichal Kazior out: 37955e3dd157SKalle Valo dev_kfree_skb(skb); 37965e3dd157SKalle Valo } 37975e3dd157SKalle Valo 3798d7579d12SMichal Kazior static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb) 37998a6618b0SBartosz Markowski { 38008a6618b0SBartosz Markowski struct wmi_cmd_hdr *cmd_hdr; 38018a6618b0SBartosz Markowski enum wmi_10x_event_id id; 380243d2a30fSKalle Valo bool consumed; 38038a6618b0SBartosz Markowski 38048a6618b0SBartosz Markowski cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 38058a6618b0SBartosz Markowski id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 38068a6618b0SBartosz Markowski 38078a6618b0SBartosz Markowski if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 3808469d479fSMichal Kazior goto out; 38098a6618b0SBartosz Markowski 3810d35a6c18SMichal Kazior trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 38118a6618b0SBartosz Markowski 381243d2a30fSKalle Valo consumed = ath10k_tm_event_wmi(ar, id, skb); 381343d2a30fSKalle Valo 381443d2a30fSKalle Valo /* Ready event must be handled normally also in UTF mode so that we 381543d2a30fSKalle Valo * know the UTF firmware has booted, others we are just bypass WMI 381643d2a30fSKalle Valo * events to testmode. 381743d2a30fSKalle Valo */ 381843d2a30fSKalle Valo if (consumed && id != WMI_10X_READY_EVENTID) { 381943d2a30fSKalle Valo ath10k_dbg(ar, ATH10K_DBG_WMI, 382043d2a30fSKalle Valo "wmi testmode consumed 0x%x\n", id); 382143d2a30fSKalle Valo goto out; 382243d2a30fSKalle Valo } 382343d2a30fSKalle Valo 38248a6618b0SBartosz Markowski switch (id) { 38258a6618b0SBartosz Markowski case WMI_10X_MGMT_RX_EVENTID: 38268a6618b0SBartosz Markowski ath10k_wmi_event_mgmt_rx(ar, skb); 38278a6618b0SBartosz Markowski /* mgmt_rx() owns the skb now! */ 38288a6618b0SBartosz Markowski return; 38298a6618b0SBartosz Markowski case WMI_10X_SCAN_EVENTID: 38308a6618b0SBartosz Markowski ath10k_wmi_event_scan(ar, skb); 38318a6618b0SBartosz Markowski break; 38328a6618b0SBartosz Markowski case WMI_10X_CHAN_INFO_EVENTID: 38338a6618b0SBartosz Markowski ath10k_wmi_event_chan_info(ar, skb); 38348a6618b0SBartosz Markowski break; 38358a6618b0SBartosz Markowski case WMI_10X_ECHO_EVENTID: 38368a6618b0SBartosz Markowski ath10k_wmi_event_echo(ar, skb); 38378a6618b0SBartosz Markowski break; 38388a6618b0SBartosz Markowski case WMI_10X_DEBUG_MESG_EVENTID: 38398a6618b0SBartosz Markowski ath10k_wmi_event_debug_mesg(ar, skb); 38408a6618b0SBartosz Markowski break; 38418a6618b0SBartosz Markowski case WMI_10X_UPDATE_STATS_EVENTID: 38428a6618b0SBartosz Markowski ath10k_wmi_event_update_stats(ar, skb); 38438a6618b0SBartosz Markowski break; 38448a6618b0SBartosz Markowski case WMI_10X_VDEV_START_RESP_EVENTID: 38458a6618b0SBartosz Markowski ath10k_wmi_event_vdev_start_resp(ar, skb); 38468a6618b0SBartosz Markowski break; 38478a6618b0SBartosz Markowski case WMI_10X_VDEV_STOPPED_EVENTID: 38488a6618b0SBartosz Markowski ath10k_wmi_event_vdev_stopped(ar, skb); 38498a6618b0SBartosz Markowski break; 38508a6618b0SBartosz Markowski case WMI_10X_PEER_STA_KICKOUT_EVENTID: 38518a6618b0SBartosz Markowski ath10k_wmi_event_peer_sta_kickout(ar, skb); 38528a6618b0SBartosz Markowski break; 38538a6618b0SBartosz Markowski case WMI_10X_HOST_SWBA_EVENTID: 38548a6618b0SBartosz Markowski ath10k_wmi_event_host_swba(ar, skb); 38558a6618b0SBartosz Markowski break; 38568a6618b0SBartosz Markowski case WMI_10X_TBTTOFFSET_UPDATE_EVENTID: 38578a6618b0SBartosz Markowski ath10k_wmi_event_tbttoffset_update(ar, skb); 38588a6618b0SBartosz Markowski break; 38598a6618b0SBartosz Markowski case WMI_10X_PHYERR_EVENTID: 38608a6618b0SBartosz Markowski ath10k_wmi_event_phyerr(ar, skb); 38618a6618b0SBartosz Markowski break; 38628a6618b0SBartosz Markowski case WMI_10X_ROAM_EVENTID: 38638a6618b0SBartosz Markowski ath10k_wmi_event_roam(ar, skb); 38648a6618b0SBartosz Markowski break; 38658a6618b0SBartosz Markowski case WMI_10X_PROFILE_MATCH: 38668a6618b0SBartosz Markowski ath10k_wmi_event_profile_match(ar, skb); 38678a6618b0SBartosz Markowski break; 38688a6618b0SBartosz Markowski case WMI_10X_DEBUG_PRINT_EVENTID: 38698a6618b0SBartosz Markowski ath10k_wmi_event_debug_print(ar, skb); 38708a6618b0SBartosz Markowski break; 38718a6618b0SBartosz Markowski case WMI_10X_PDEV_QVIT_EVENTID: 38728a6618b0SBartosz Markowski ath10k_wmi_event_pdev_qvit(ar, skb); 38738a6618b0SBartosz Markowski break; 38748a6618b0SBartosz Markowski case WMI_10X_WLAN_PROFILE_DATA_EVENTID: 38758a6618b0SBartosz Markowski ath10k_wmi_event_wlan_profile_data(ar, skb); 38768a6618b0SBartosz Markowski break; 38778a6618b0SBartosz Markowski case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID: 38788a6618b0SBartosz Markowski ath10k_wmi_event_rtt_measurement_report(ar, skb); 38798a6618b0SBartosz Markowski break; 38808a6618b0SBartosz Markowski case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID: 38818a6618b0SBartosz Markowski ath10k_wmi_event_tsf_measurement_report(ar, skb); 38828a6618b0SBartosz Markowski break; 38838a6618b0SBartosz Markowski case WMI_10X_RTT_ERROR_REPORT_EVENTID: 38848a6618b0SBartosz Markowski ath10k_wmi_event_rtt_error_report(ar, skb); 38858a6618b0SBartosz Markowski break; 38868a6618b0SBartosz Markowski case WMI_10X_WOW_WAKEUP_HOST_EVENTID: 38878a6618b0SBartosz Markowski ath10k_wmi_event_wow_wakeup_host(ar, skb); 38888a6618b0SBartosz Markowski break; 38898a6618b0SBartosz Markowski case WMI_10X_DCS_INTERFERENCE_EVENTID: 38908a6618b0SBartosz Markowski ath10k_wmi_event_dcs_interference(ar, skb); 38918a6618b0SBartosz Markowski break; 38928a6618b0SBartosz Markowski case WMI_10X_PDEV_TPC_CONFIG_EVENTID: 38938a6618b0SBartosz Markowski ath10k_wmi_event_pdev_tpc_config(ar, skb); 38948a6618b0SBartosz Markowski break; 38958a6618b0SBartosz Markowski case WMI_10X_INST_RSSI_STATS_EVENTID: 38968a6618b0SBartosz Markowski ath10k_wmi_event_inst_rssi_stats(ar, skb); 38978a6618b0SBartosz Markowski break; 38988a6618b0SBartosz Markowski case WMI_10X_VDEV_STANDBY_REQ_EVENTID: 38998a6618b0SBartosz Markowski ath10k_wmi_event_vdev_standby_req(ar, skb); 39008a6618b0SBartosz Markowski break; 39018a6618b0SBartosz Markowski case WMI_10X_VDEV_RESUME_REQ_EVENTID: 39028a6618b0SBartosz Markowski ath10k_wmi_event_vdev_resume_req(ar, skb); 39038a6618b0SBartosz Markowski break; 39048a6618b0SBartosz Markowski case WMI_10X_SERVICE_READY_EVENTID: 3905b34d2b3dSMichal Kazior ath10k_wmi_event_service_ready(ar, skb); 39068a6618b0SBartosz Markowski break; 39078a6618b0SBartosz Markowski case WMI_10X_READY_EVENTID: 3908b34d2b3dSMichal Kazior ath10k_wmi_event_ready(ar, skb); 39098a6618b0SBartosz Markowski break; 391043d2a30fSKalle Valo case WMI_10X_PDEV_UTF_EVENTID: 391143d2a30fSKalle Valo /* ignore utf events */ 391243d2a30fSKalle Valo break; 39138a6618b0SBartosz Markowski default: 39147aa7a72aSMichal Kazior ath10k_warn(ar, "Unknown eventid: %d\n", id); 39158a6618b0SBartosz Markowski break; 39168a6618b0SBartosz Markowski } 39178a6618b0SBartosz Markowski 391843d2a30fSKalle Valo out: 39198a6618b0SBartosz Markowski dev_kfree_skb(skb); 39208a6618b0SBartosz Markowski } 39218a6618b0SBartosz Markowski 3922d7579d12SMichal Kazior static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb) 392324c88f78SMichal Kazior { 392424c88f78SMichal Kazior struct wmi_cmd_hdr *cmd_hdr; 392524c88f78SMichal Kazior enum wmi_10_2_event_id id; 392624c88f78SMichal Kazior 392724c88f78SMichal Kazior cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 392824c88f78SMichal Kazior id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 392924c88f78SMichal Kazior 393024c88f78SMichal Kazior if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 3931469d479fSMichal Kazior goto out; 393224c88f78SMichal Kazior 3933d35a6c18SMichal Kazior trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 393424c88f78SMichal Kazior 393524c88f78SMichal Kazior switch (id) { 393624c88f78SMichal Kazior case WMI_10_2_MGMT_RX_EVENTID: 393724c88f78SMichal Kazior ath10k_wmi_event_mgmt_rx(ar, skb); 393824c88f78SMichal Kazior /* mgmt_rx() owns the skb now! */ 393924c88f78SMichal Kazior return; 394024c88f78SMichal Kazior case WMI_10_2_SCAN_EVENTID: 394124c88f78SMichal Kazior ath10k_wmi_event_scan(ar, skb); 394224c88f78SMichal Kazior break; 394324c88f78SMichal Kazior case WMI_10_2_CHAN_INFO_EVENTID: 394424c88f78SMichal Kazior ath10k_wmi_event_chan_info(ar, skb); 394524c88f78SMichal Kazior break; 394624c88f78SMichal Kazior case WMI_10_2_ECHO_EVENTID: 394724c88f78SMichal Kazior ath10k_wmi_event_echo(ar, skb); 394824c88f78SMichal Kazior break; 394924c88f78SMichal Kazior case WMI_10_2_DEBUG_MESG_EVENTID: 395024c88f78SMichal Kazior ath10k_wmi_event_debug_mesg(ar, skb); 395124c88f78SMichal Kazior break; 395224c88f78SMichal Kazior case WMI_10_2_UPDATE_STATS_EVENTID: 395324c88f78SMichal Kazior ath10k_wmi_event_update_stats(ar, skb); 395424c88f78SMichal Kazior break; 395524c88f78SMichal Kazior case WMI_10_2_VDEV_START_RESP_EVENTID: 395624c88f78SMichal Kazior ath10k_wmi_event_vdev_start_resp(ar, skb); 395724c88f78SMichal Kazior break; 395824c88f78SMichal Kazior case WMI_10_2_VDEV_STOPPED_EVENTID: 395924c88f78SMichal Kazior ath10k_wmi_event_vdev_stopped(ar, skb); 396024c88f78SMichal Kazior break; 396124c88f78SMichal Kazior case WMI_10_2_PEER_STA_KICKOUT_EVENTID: 396224c88f78SMichal Kazior ath10k_wmi_event_peer_sta_kickout(ar, skb); 396324c88f78SMichal Kazior break; 396424c88f78SMichal Kazior case WMI_10_2_HOST_SWBA_EVENTID: 396524c88f78SMichal Kazior ath10k_wmi_event_host_swba(ar, skb); 396624c88f78SMichal Kazior break; 396724c88f78SMichal Kazior case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID: 396824c88f78SMichal Kazior ath10k_wmi_event_tbttoffset_update(ar, skb); 396924c88f78SMichal Kazior break; 397024c88f78SMichal Kazior case WMI_10_2_PHYERR_EVENTID: 397124c88f78SMichal Kazior ath10k_wmi_event_phyerr(ar, skb); 397224c88f78SMichal Kazior break; 397324c88f78SMichal Kazior case WMI_10_2_ROAM_EVENTID: 397424c88f78SMichal Kazior ath10k_wmi_event_roam(ar, skb); 397524c88f78SMichal Kazior break; 397624c88f78SMichal Kazior case WMI_10_2_PROFILE_MATCH: 397724c88f78SMichal Kazior ath10k_wmi_event_profile_match(ar, skb); 397824c88f78SMichal Kazior break; 397924c88f78SMichal Kazior case WMI_10_2_DEBUG_PRINT_EVENTID: 398024c88f78SMichal Kazior ath10k_wmi_event_debug_print(ar, skb); 398124c88f78SMichal Kazior break; 398224c88f78SMichal Kazior case WMI_10_2_PDEV_QVIT_EVENTID: 398324c88f78SMichal Kazior ath10k_wmi_event_pdev_qvit(ar, skb); 398424c88f78SMichal Kazior break; 398524c88f78SMichal Kazior case WMI_10_2_WLAN_PROFILE_DATA_EVENTID: 398624c88f78SMichal Kazior ath10k_wmi_event_wlan_profile_data(ar, skb); 398724c88f78SMichal Kazior break; 398824c88f78SMichal Kazior case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID: 398924c88f78SMichal Kazior ath10k_wmi_event_rtt_measurement_report(ar, skb); 399024c88f78SMichal Kazior break; 399124c88f78SMichal Kazior case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID: 399224c88f78SMichal Kazior ath10k_wmi_event_tsf_measurement_report(ar, skb); 399324c88f78SMichal Kazior break; 399424c88f78SMichal Kazior case WMI_10_2_RTT_ERROR_REPORT_EVENTID: 399524c88f78SMichal Kazior ath10k_wmi_event_rtt_error_report(ar, skb); 399624c88f78SMichal Kazior break; 399724c88f78SMichal Kazior case WMI_10_2_WOW_WAKEUP_HOST_EVENTID: 399824c88f78SMichal Kazior ath10k_wmi_event_wow_wakeup_host(ar, skb); 399924c88f78SMichal Kazior break; 400024c88f78SMichal Kazior case WMI_10_2_DCS_INTERFERENCE_EVENTID: 400124c88f78SMichal Kazior ath10k_wmi_event_dcs_interference(ar, skb); 400224c88f78SMichal Kazior break; 400324c88f78SMichal Kazior case WMI_10_2_PDEV_TPC_CONFIG_EVENTID: 400424c88f78SMichal Kazior ath10k_wmi_event_pdev_tpc_config(ar, skb); 400524c88f78SMichal Kazior break; 400624c88f78SMichal Kazior case WMI_10_2_INST_RSSI_STATS_EVENTID: 400724c88f78SMichal Kazior ath10k_wmi_event_inst_rssi_stats(ar, skb); 400824c88f78SMichal Kazior break; 400924c88f78SMichal Kazior case WMI_10_2_VDEV_STANDBY_REQ_EVENTID: 401024c88f78SMichal Kazior ath10k_wmi_event_vdev_standby_req(ar, skb); 401124c88f78SMichal Kazior break; 401224c88f78SMichal Kazior case WMI_10_2_VDEV_RESUME_REQ_EVENTID: 401324c88f78SMichal Kazior ath10k_wmi_event_vdev_resume_req(ar, skb); 401424c88f78SMichal Kazior break; 401524c88f78SMichal Kazior case WMI_10_2_SERVICE_READY_EVENTID: 4016b34d2b3dSMichal Kazior ath10k_wmi_event_service_ready(ar, skb); 401724c88f78SMichal Kazior break; 401824c88f78SMichal Kazior case WMI_10_2_READY_EVENTID: 4019b34d2b3dSMichal Kazior ath10k_wmi_event_ready(ar, skb); 402024c88f78SMichal Kazior break; 4021a57a6a27SRajkumar Manoharan case WMI_10_2_PDEV_TEMPERATURE_EVENTID: 4022a57a6a27SRajkumar Manoharan ath10k_wmi_event_temperature(ar, skb); 4023a57a6a27SRajkumar Manoharan break; 402424c88f78SMichal Kazior case WMI_10_2_RTT_KEEPALIVE_EVENTID: 402524c88f78SMichal Kazior case WMI_10_2_GPIO_INPUT_EVENTID: 402624c88f78SMichal Kazior case WMI_10_2_PEER_RATECODE_LIST_EVENTID: 402724c88f78SMichal Kazior case WMI_10_2_GENERIC_BUFFER_EVENTID: 402824c88f78SMichal Kazior case WMI_10_2_MCAST_BUF_RELEASE_EVENTID: 402924c88f78SMichal Kazior case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID: 403024c88f78SMichal Kazior case WMI_10_2_WDS_PEER_EVENTID: 40317aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 403224c88f78SMichal Kazior "received event id %d not implemented\n", id); 403324c88f78SMichal Kazior break; 403424c88f78SMichal Kazior default: 40357aa7a72aSMichal Kazior ath10k_warn(ar, "Unknown eventid: %d\n", id); 403624c88f78SMichal Kazior break; 403724c88f78SMichal Kazior } 403824c88f78SMichal Kazior 4039469d479fSMichal Kazior out: 404024c88f78SMichal Kazior dev_kfree_skb(skb); 404124c88f78SMichal Kazior } 40428a6618b0SBartosz Markowski 4043ce42870eSBartosz Markowski static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb) 4044ce42870eSBartosz Markowski { 4045d7579d12SMichal Kazior int ret; 4046d7579d12SMichal Kazior 4047d7579d12SMichal Kazior ret = ath10k_wmi_rx(ar, skb); 4048d7579d12SMichal Kazior if (ret) 4049d7579d12SMichal Kazior ath10k_warn(ar, "failed to process wmi rx: %d\n", ret); 405024c88f78SMichal Kazior } 4051ce42870eSBartosz Markowski 405295bf21f9SMichal Kazior int ath10k_wmi_connect(struct ath10k *ar) 40535e3dd157SKalle Valo { 40545e3dd157SKalle Valo int status; 40555e3dd157SKalle Valo struct ath10k_htc_svc_conn_req conn_req; 40565e3dd157SKalle Valo struct ath10k_htc_svc_conn_resp conn_resp; 40575e3dd157SKalle Valo 40585e3dd157SKalle Valo memset(&conn_req, 0, sizeof(conn_req)); 40595e3dd157SKalle Valo memset(&conn_resp, 0, sizeof(conn_resp)); 40605e3dd157SKalle Valo 40615e3dd157SKalle Valo /* these fields are the same for all service endpoints */ 40625e3dd157SKalle Valo conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete; 40635e3dd157SKalle Valo conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx; 4064be8b3943SMichal Kazior conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits; 40655e3dd157SKalle Valo 40665e3dd157SKalle Valo /* connect to control service */ 40675e3dd157SKalle Valo conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL; 40685e3dd157SKalle Valo 4069cd003fadSMichal Kazior status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp); 40705e3dd157SKalle Valo if (status) { 40717aa7a72aSMichal Kazior ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n", 40725e3dd157SKalle Valo status); 40735e3dd157SKalle Valo return status; 40745e3dd157SKalle Valo } 40755e3dd157SKalle Valo 40765e3dd157SKalle Valo ar->wmi.eid = conn_resp.eid; 40775e3dd157SKalle Valo return 0; 40785e3dd157SKalle Valo } 40795e3dd157SKalle Valo 4080d7579d12SMichal Kazior static struct sk_buff * 4081d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g, 4082d7579d12SMichal Kazior u16 ctl2g, u16 ctl5g, 4083d7579d12SMichal Kazior enum wmi_dfs_region dfs_reg) 40845e3dd157SKalle Valo { 40855e3dd157SKalle Valo struct wmi_pdev_set_regdomain_cmd *cmd; 40865e3dd157SKalle Valo struct sk_buff *skb; 40875e3dd157SKalle Valo 40887aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 40895e3dd157SKalle Valo if (!skb) 4090d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 40915e3dd157SKalle Valo 40925e3dd157SKalle Valo cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data; 40935e3dd157SKalle Valo cmd->reg_domain = __cpu_to_le32(rd); 40945e3dd157SKalle Valo cmd->reg_domain_2G = __cpu_to_le32(rd2g); 40955e3dd157SKalle Valo cmd->reg_domain_5G = __cpu_to_le32(rd5g); 40965e3dd157SKalle Valo cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g); 40975e3dd157SKalle Valo cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g); 40985e3dd157SKalle Valo 40997aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 41005e3dd157SKalle Valo "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n", 41015e3dd157SKalle Valo rd, rd2g, rd5g, ctl2g, ctl5g); 4102d7579d12SMichal Kazior return skb; 41035e3dd157SKalle Valo } 41045e3dd157SKalle Valo 4105d7579d12SMichal Kazior static struct sk_buff * 4106d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 4107d7579d12SMichal Kazior rd5g, u16 ctl2g, u16 ctl5g, 4108821af6aeSMarek Puzyniak enum wmi_dfs_region dfs_reg) 4109821af6aeSMarek Puzyniak { 4110821af6aeSMarek Puzyniak struct wmi_pdev_set_regdomain_cmd_10x *cmd; 4111821af6aeSMarek Puzyniak struct sk_buff *skb; 4112821af6aeSMarek Puzyniak 41137aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 4114821af6aeSMarek Puzyniak if (!skb) 4115d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 4116821af6aeSMarek Puzyniak 4117821af6aeSMarek Puzyniak cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data; 4118821af6aeSMarek Puzyniak cmd->reg_domain = __cpu_to_le32(rd); 4119821af6aeSMarek Puzyniak cmd->reg_domain_2G = __cpu_to_le32(rd2g); 4120821af6aeSMarek Puzyniak cmd->reg_domain_5G = __cpu_to_le32(rd5g); 4121821af6aeSMarek Puzyniak cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g); 4122821af6aeSMarek Puzyniak cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g); 4123821af6aeSMarek Puzyniak cmd->dfs_domain = __cpu_to_le32(dfs_reg); 4124821af6aeSMarek Puzyniak 41257aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 4126821af6aeSMarek Puzyniak "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n", 4127821af6aeSMarek Puzyniak rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg); 4128d7579d12SMichal Kazior return skb; 4129821af6aeSMarek Puzyniak } 4130821af6aeSMarek Puzyniak 4131d7579d12SMichal Kazior static struct sk_buff * 4132d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt) 41335e3dd157SKalle Valo { 41345e3dd157SKalle Valo struct wmi_pdev_suspend_cmd *cmd; 41355e3dd157SKalle Valo struct sk_buff *skb; 41365e3dd157SKalle Valo 41377aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 41385e3dd157SKalle Valo if (!skb) 4139d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 41405e3dd157SKalle Valo 41415e3dd157SKalle Valo cmd = (struct wmi_pdev_suspend_cmd *)skb->data; 414200f5482bSMarek Puzyniak cmd->suspend_opt = __cpu_to_le32(suspend_opt); 41435e3dd157SKalle Valo 4144d7579d12SMichal Kazior return skb; 41455e3dd157SKalle Valo } 41465e3dd157SKalle Valo 4147d7579d12SMichal Kazior static struct sk_buff * 4148d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar) 41495e3dd157SKalle Valo { 41505e3dd157SKalle Valo struct sk_buff *skb; 41515e3dd157SKalle Valo 41527aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, 0); 4153d7579d12SMichal Kazior if (!skb) 4154d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 41555e3dd157SKalle Valo 4156d7579d12SMichal Kazior return skb; 41575e3dd157SKalle Valo } 41585e3dd157SKalle Valo 4159d7579d12SMichal Kazior static struct sk_buff * 4160d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value) 41615e3dd157SKalle Valo { 41625e3dd157SKalle Valo struct wmi_pdev_set_param_cmd *cmd; 41635e3dd157SKalle Valo struct sk_buff *skb; 41645e3dd157SKalle Valo 4165226a339bSBartosz Markowski if (id == WMI_PDEV_PARAM_UNSUPPORTED) { 41667aa7a72aSMichal Kazior ath10k_warn(ar, "pdev param %d not supported by firmware\n", 41677aa7a72aSMichal Kazior id); 4168d7579d12SMichal Kazior return ERR_PTR(-EOPNOTSUPP); 4169226a339bSBartosz Markowski } 4170226a339bSBartosz Markowski 41717aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 41725e3dd157SKalle Valo if (!skb) 4173d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 41745e3dd157SKalle Valo 41755e3dd157SKalle Valo cmd = (struct wmi_pdev_set_param_cmd *)skb->data; 41765e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(id); 41775e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(value); 41785e3dd157SKalle Valo 41797aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n", 41805e3dd157SKalle Valo id, value); 4181d7579d12SMichal Kazior return skb; 41825e3dd157SKalle Valo } 41835e3dd157SKalle Valo 41840226d602SMichal Kazior void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar, 4185cf9fca8fSMichal Kazior struct wmi_host_mem_chunks *chunks) 4186cf9fca8fSMichal Kazior { 4187cf9fca8fSMichal Kazior struct host_memory_chunk *chunk; 4188cf9fca8fSMichal Kazior int i; 4189cf9fca8fSMichal Kazior 4190cf9fca8fSMichal Kazior chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks); 4191cf9fca8fSMichal Kazior 4192cf9fca8fSMichal Kazior for (i = 0; i < ar->wmi.num_mem_chunks; i++) { 4193cf9fca8fSMichal Kazior chunk = &chunks->items[i]; 4194cf9fca8fSMichal Kazior chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr); 4195cf9fca8fSMichal Kazior chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len); 4196cf9fca8fSMichal Kazior chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id); 4197cf9fca8fSMichal Kazior 4198cf9fca8fSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 4199cf9fca8fSMichal Kazior "wmi chunk %d len %d requested, addr 0x%llx\n", 4200cf9fca8fSMichal Kazior i, 4201cf9fca8fSMichal Kazior ar->wmi.mem_chunks[i].len, 4202cf9fca8fSMichal Kazior (unsigned long long)ar->wmi.mem_chunks[i].paddr); 4203cf9fca8fSMichal Kazior } 4204cf9fca8fSMichal Kazior } 4205cf9fca8fSMichal Kazior 4206d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar) 42075e3dd157SKalle Valo { 42085e3dd157SKalle Valo struct wmi_init_cmd *cmd; 42095e3dd157SKalle Valo struct sk_buff *buf; 42105e3dd157SKalle Valo struct wmi_resource_config config = {}; 4211b3effe61SBartosz Markowski u32 len, val; 42125e3dd157SKalle Valo 42135e3dd157SKalle Valo config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS); 4214cfd1061eSMichal Kazior config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS); 42155e3dd157SKalle Valo config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS); 42165e3dd157SKalle Valo 42175e3dd157SKalle Valo config.num_offload_reorder_bufs = 42185e3dd157SKalle Valo __cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS); 42195e3dd157SKalle Valo 42205e3dd157SKalle Valo config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS); 42215e3dd157SKalle Valo config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS); 42225e3dd157SKalle Valo config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT); 42235e3dd157SKalle Valo config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK); 42245e3dd157SKalle Valo config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK); 42255e3dd157SKalle Valo config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 42265e3dd157SKalle Valo config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 42275e3dd157SKalle Valo config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 42285e3dd157SKalle Valo config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI); 42295e3dd157SKalle Valo config.rx_decap_mode = __cpu_to_le32(TARGET_RX_DECAP_MODE); 42305e3dd157SKalle Valo 42315e3dd157SKalle Valo config.scan_max_pending_reqs = 42325e3dd157SKalle Valo __cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS); 42335e3dd157SKalle Valo 42345e3dd157SKalle Valo config.bmiss_offload_max_vdev = 42355e3dd157SKalle Valo __cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV); 42365e3dd157SKalle Valo 42375e3dd157SKalle Valo config.roam_offload_max_vdev = 42385e3dd157SKalle Valo __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV); 42395e3dd157SKalle Valo 42405e3dd157SKalle Valo config.roam_offload_max_ap_profiles = 42415e3dd157SKalle Valo __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES); 42425e3dd157SKalle Valo 42435e3dd157SKalle Valo config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS); 42445e3dd157SKalle Valo config.num_mcast_table_elems = 42455e3dd157SKalle Valo __cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS); 42465e3dd157SKalle Valo 42475e3dd157SKalle Valo config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE); 42485e3dd157SKalle Valo config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE); 42495e3dd157SKalle Valo config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES); 42505e3dd157SKalle Valo config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE); 42515e3dd157SKalle Valo config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM); 42525e3dd157SKalle Valo 42535e3dd157SKalle Valo val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 42545e3dd157SKalle Valo config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 42555e3dd157SKalle Valo 42565e3dd157SKalle Valo config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG); 42575e3dd157SKalle Valo 42585e3dd157SKalle Valo config.gtk_offload_max_vdev = 42595e3dd157SKalle Valo __cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV); 42605e3dd157SKalle Valo 42615e3dd157SKalle Valo config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC); 42625e3dd157SKalle Valo config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES); 42635e3dd157SKalle Valo 4264b3effe61SBartosz Markowski len = sizeof(*cmd) + 4265b3effe61SBartosz Markowski (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); 4266b3effe61SBartosz Markowski 42677aa7a72aSMichal Kazior buf = ath10k_wmi_alloc_skb(ar, len); 42685e3dd157SKalle Valo if (!buf) 4269d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 42705e3dd157SKalle Valo 42715e3dd157SKalle Valo cmd = (struct wmi_init_cmd *)buf->data; 4272b3effe61SBartosz Markowski 42735e3dd157SKalle Valo memcpy(&cmd->resource_config, &config, sizeof(config)); 4274cf9fca8fSMichal Kazior ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 42755e3dd157SKalle Valo 42767aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n"); 4277d7579d12SMichal Kazior return buf; 42785e3dd157SKalle Valo } 42795e3dd157SKalle Valo 4280d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar) 428112b2b9e3SBartosz Markowski { 428212b2b9e3SBartosz Markowski struct wmi_init_cmd_10x *cmd; 428312b2b9e3SBartosz Markowski struct sk_buff *buf; 428412b2b9e3SBartosz Markowski struct wmi_resource_config_10x config = {}; 428512b2b9e3SBartosz Markowski u32 len, val; 428612b2b9e3SBartosz Markowski 4287ec6a73f0SBartosz Markowski config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS); 4288ec6a73f0SBartosz Markowski config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS); 4289ec6a73f0SBartosz Markowski config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS); 4290ec6a73f0SBartosz Markowski config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); 4291ec6a73f0SBartosz Markowski config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT); 4292ec6a73f0SBartosz Markowski config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); 4293ec6a73f0SBartosz Markowski config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); 4294ec6a73f0SBartosz Markowski config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 4295ec6a73f0SBartosz Markowski config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 4296ec6a73f0SBartosz Markowski config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 4297ec6a73f0SBartosz Markowski config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI); 4298ec6a73f0SBartosz Markowski config.rx_decap_mode = __cpu_to_le32(TARGET_10X_RX_DECAP_MODE); 429912b2b9e3SBartosz Markowski 430012b2b9e3SBartosz Markowski config.scan_max_pending_reqs = 4301ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS); 430212b2b9e3SBartosz Markowski 430312b2b9e3SBartosz Markowski config.bmiss_offload_max_vdev = 4304ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV); 430512b2b9e3SBartosz Markowski 430612b2b9e3SBartosz Markowski config.roam_offload_max_vdev = 4307ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV); 430812b2b9e3SBartosz Markowski 430912b2b9e3SBartosz Markowski config.roam_offload_max_ap_profiles = 4310ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES); 431112b2b9e3SBartosz Markowski 4312ec6a73f0SBartosz Markowski config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS); 431312b2b9e3SBartosz Markowski config.num_mcast_table_elems = 4314ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS); 431512b2b9e3SBartosz Markowski 4316ec6a73f0SBartosz Markowski config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE); 4317ec6a73f0SBartosz Markowski config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE); 4318ec6a73f0SBartosz Markowski config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES); 4319ec6a73f0SBartosz Markowski config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE); 4320ec6a73f0SBartosz Markowski config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM); 432112b2b9e3SBartosz Markowski 4322ec6a73f0SBartosz Markowski val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 432312b2b9e3SBartosz Markowski config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 432412b2b9e3SBartosz Markowski 4325ec6a73f0SBartosz Markowski config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG); 432612b2b9e3SBartosz Markowski 4327ec6a73f0SBartosz Markowski config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC); 4328ec6a73f0SBartosz Markowski config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES); 432912b2b9e3SBartosz Markowski 433012b2b9e3SBartosz Markowski len = sizeof(*cmd) + 433112b2b9e3SBartosz Markowski (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); 433212b2b9e3SBartosz Markowski 43337aa7a72aSMichal Kazior buf = ath10k_wmi_alloc_skb(ar, len); 433412b2b9e3SBartosz Markowski if (!buf) 4335d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 433612b2b9e3SBartosz Markowski 433712b2b9e3SBartosz Markowski cmd = (struct wmi_init_cmd_10x *)buf->data; 433812b2b9e3SBartosz Markowski 433912b2b9e3SBartosz Markowski memcpy(&cmd->resource_config, &config, sizeof(config)); 4340cf9fca8fSMichal Kazior ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 434112b2b9e3SBartosz Markowski 43427aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n"); 4343d7579d12SMichal Kazior return buf; 434412b2b9e3SBartosz Markowski } 434512b2b9e3SBartosz Markowski 4346d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar) 434724c88f78SMichal Kazior { 434824c88f78SMichal Kazior struct wmi_init_cmd_10_2 *cmd; 434924c88f78SMichal Kazior struct sk_buff *buf; 435024c88f78SMichal Kazior struct wmi_resource_config_10x config = {}; 4351b6c8e287SSujith Manoharan u32 len, val, features; 435224c88f78SMichal Kazior 435324c88f78SMichal Kazior config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS); 435424c88f78SMichal Kazior config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS); 435524c88f78SMichal Kazior config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS); 435624c88f78SMichal Kazior config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); 435724c88f78SMichal Kazior config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT); 435824c88f78SMichal Kazior config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); 435924c88f78SMichal Kazior config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); 436024c88f78SMichal Kazior config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 436124c88f78SMichal Kazior config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 436224c88f78SMichal Kazior config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 436324c88f78SMichal Kazior config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI); 436424c88f78SMichal Kazior config.rx_decap_mode = __cpu_to_le32(TARGET_10X_RX_DECAP_MODE); 436524c88f78SMichal Kazior 436624c88f78SMichal Kazior config.scan_max_pending_reqs = 436724c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS); 436824c88f78SMichal Kazior 436924c88f78SMichal Kazior config.bmiss_offload_max_vdev = 437024c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV); 437124c88f78SMichal Kazior 437224c88f78SMichal Kazior config.roam_offload_max_vdev = 437324c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV); 437424c88f78SMichal Kazior 437524c88f78SMichal Kazior config.roam_offload_max_ap_profiles = 437624c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES); 437724c88f78SMichal Kazior 437824c88f78SMichal Kazior config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS); 437924c88f78SMichal Kazior config.num_mcast_table_elems = 438024c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS); 438124c88f78SMichal Kazior 438224c88f78SMichal Kazior config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE); 438324c88f78SMichal Kazior config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE); 438424c88f78SMichal Kazior config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES); 4385f6603ff2SSujith Manoharan config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE); 438624c88f78SMichal Kazior config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM); 438724c88f78SMichal Kazior 438824c88f78SMichal Kazior val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 438924c88f78SMichal Kazior config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 439024c88f78SMichal Kazior 439124c88f78SMichal Kazior config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG); 439224c88f78SMichal Kazior 439324c88f78SMichal Kazior config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC); 439424c88f78SMichal Kazior config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES); 439524c88f78SMichal Kazior 439624c88f78SMichal Kazior len = sizeof(*cmd) + 439724c88f78SMichal Kazior (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); 439824c88f78SMichal Kazior 43997aa7a72aSMichal Kazior buf = ath10k_wmi_alloc_skb(ar, len); 440024c88f78SMichal Kazior if (!buf) 4401d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 440224c88f78SMichal Kazior 440324c88f78SMichal Kazior cmd = (struct wmi_init_cmd_10_2 *)buf->data; 440424c88f78SMichal Kazior 4405b6c8e287SSujith Manoharan features = WMI_10_2_RX_BATCH_MODE; 4406de0c789bSYanbo Li if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map)) 4407de0c789bSYanbo Li features |= WMI_10_2_COEX_GPIO; 4408b6c8e287SSujith Manoharan cmd->resource_config.feature_mask = __cpu_to_le32(features); 4409b6c8e287SSujith Manoharan 441024c88f78SMichal Kazior memcpy(&cmd->resource_config.common, &config, sizeof(config)); 4411cf9fca8fSMichal Kazior ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 441224c88f78SMichal Kazior 44137aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n"); 4414d7579d12SMichal Kazior return buf; 441512b2b9e3SBartosz Markowski } 441612b2b9e3SBartosz Markowski 44170226d602SMichal Kazior int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg) 44185e3dd157SKalle Valo { 4419a6aa5da3SMichal Kazior if (arg->ie_len && !arg->ie) 44205e3dd157SKalle Valo return -EINVAL; 4421a6aa5da3SMichal Kazior if (arg->n_channels && !arg->channels) 4422a6aa5da3SMichal Kazior return -EINVAL; 4423a6aa5da3SMichal Kazior if (arg->n_ssids && !arg->ssids) 4424a6aa5da3SMichal Kazior return -EINVAL; 4425a6aa5da3SMichal Kazior if (arg->n_bssids && !arg->bssids) 4426a6aa5da3SMichal Kazior return -EINVAL; 4427a6aa5da3SMichal Kazior 44285e3dd157SKalle Valo if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN) 44295e3dd157SKalle Valo return -EINVAL; 4430a6aa5da3SMichal Kazior if (arg->n_channels > ARRAY_SIZE(arg->channels)) 4431a6aa5da3SMichal Kazior return -EINVAL; 4432a6aa5da3SMichal Kazior if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID) 4433a6aa5da3SMichal Kazior return -EINVAL; 4434a6aa5da3SMichal Kazior if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID) 4435a6aa5da3SMichal Kazior return -EINVAL; 44365e3dd157SKalle Valo 4437a6aa5da3SMichal Kazior return 0; 4438a6aa5da3SMichal Kazior } 4439a6aa5da3SMichal Kazior 4440a6aa5da3SMichal Kazior static size_t 4441a6aa5da3SMichal Kazior ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg) 4442a6aa5da3SMichal Kazior { 4443a6aa5da3SMichal Kazior int len = 0; 4444a6aa5da3SMichal Kazior 4445a6aa5da3SMichal Kazior if (arg->ie_len) { 44465e3dd157SKalle Valo len += sizeof(struct wmi_ie_data); 44475e3dd157SKalle Valo len += roundup(arg->ie_len, 4); 44485e3dd157SKalle Valo } 44495e3dd157SKalle Valo 44505e3dd157SKalle Valo if (arg->n_channels) { 44515e3dd157SKalle Valo len += sizeof(struct wmi_chan_list); 44525e3dd157SKalle Valo len += sizeof(__le32) * arg->n_channels; 44535e3dd157SKalle Valo } 44545e3dd157SKalle Valo 44555e3dd157SKalle Valo if (arg->n_ssids) { 44565e3dd157SKalle Valo len += sizeof(struct wmi_ssid_list); 44575e3dd157SKalle Valo len += sizeof(struct wmi_ssid) * arg->n_ssids; 44585e3dd157SKalle Valo } 44595e3dd157SKalle Valo 44605e3dd157SKalle Valo if (arg->n_bssids) { 44615e3dd157SKalle Valo len += sizeof(struct wmi_bssid_list); 44625e3dd157SKalle Valo len += sizeof(struct wmi_mac_addr) * arg->n_bssids; 44635e3dd157SKalle Valo } 44645e3dd157SKalle Valo 44655e3dd157SKalle Valo return len; 44665e3dd157SKalle Valo } 44675e3dd157SKalle Valo 44680226d602SMichal Kazior void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn, 44695e3dd157SKalle Valo const struct wmi_start_scan_arg *arg) 44705e3dd157SKalle Valo { 44715e3dd157SKalle Valo u32 scan_id; 44725e3dd157SKalle Valo u32 scan_req_id; 44735e3dd157SKalle Valo 44745e3dd157SKalle Valo scan_id = WMI_HOST_SCAN_REQ_ID_PREFIX; 44755e3dd157SKalle Valo scan_id |= arg->scan_id; 44765e3dd157SKalle Valo 44775e3dd157SKalle Valo scan_req_id = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX; 44785e3dd157SKalle Valo scan_req_id |= arg->scan_req_id; 44795e3dd157SKalle Valo 4480a6aa5da3SMichal Kazior cmn->scan_id = __cpu_to_le32(scan_id); 4481a6aa5da3SMichal Kazior cmn->scan_req_id = __cpu_to_le32(scan_req_id); 4482a6aa5da3SMichal Kazior cmn->vdev_id = __cpu_to_le32(arg->vdev_id); 4483a6aa5da3SMichal Kazior cmn->scan_priority = __cpu_to_le32(arg->scan_priority); 4484a6aa5da3SMichal Kazior cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events); 4485a6aa5da3SMichal Kazior cmn->dwell_time_active = __cpu_to_le32(arg->dwell_time_active); 4486a6aa5da3SMichal Kazior cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive); 4487a6aa5da3SMichal Kazior cmn->min_rest_time = __cpu_to_le32(arg->min_rest_time); 4488a6aa5da3SMichal Kazior cmn->max_rest_time = __cpu_to_le32(arg->max_rest_time); 4489a6aa5da3SMichal Kazior cmn->repeat_probe_time = __cpu_to_le32(arg->repeat_probe_time); 4490a6aa5da3SMichal Kazior cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time); 4491a6aa5da3SMichal Kazior cmn->idle_time = __cpu_to_le32(arg->idle_time); 4492a6aa5da3SMichal Kazior cmn->max_scan_time = __cpu_to_le32(arg->max_scan_time); 4493a6aa5da3SMichal Kazior cmn->probe_delay = __cpu_to_le32(arg->probe_delay); 4494a6aa5da3SMichal Kazior cmn->scan_ctrl_flags = __cpu_to_le32(arg->scan_ctrl_flags); 4495a6aa5da3SMichal Kazior } 44965e3dd157SKalle Valo 4497a6aa5da3SMichal Kazior static void 4498a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs, 4499a6aa5da3SMichal Kazior const struct wmi_start_scan_arg *arg) 4500a6aa5da3SMichal Kazior { 4501a6aa5da3SMichal Kazior struct wmi_ie_data *ie; 4502a6aa5da3SMichal Kazior struct wmi_chan_list *channels; 4503a6aa5da3SMichal Kazior struct wmi_ssid_list *ssids; 4504a6aa5da3SMichal Kazior struct wmi_bssid_list *bssids; 4505a6aa5da3SMichal Kazior void *ptr = tlvs->tlvs; 4506a6aa5da3SMichal Kazior int i; 45075e3dd157SKalle Valo 45085e3dd157SKalle Valo if (arg->n_channels) { 4509a6aa5da3SMichal Kazior channels = ptr; 45105e3dd157SKalle Valo channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG); 45115e3dd157SKalle Valo channels->num_chan = __cpu_to_le32(arg->n_channels); 45125e3dd157SKalle Valo 45135e3dd157SKalle Valo for (i = 0; i < arg->n_channels; i++) 451424c88f78SMichal Kazior channels->channel_list[i].freq = 451524c88f78SMichal Kazior __cpu_to_le16(arg->channels[i]); 45165e3dd157SKalle Valo 4517a6aa5da3SMichal Kazior ptr += sizeof(*channels); 4518a6aa5da3SMichal Kazior ptr += sizeof(__le32) * arg->n_channels; 45195e3dd157SKalle Valo } 45205e3dd157SKalle Valo 45215e3dd157SKalle Valo if (arg->n_ssids) { 4522a6aa5da3SMichal Kazior ssids = ptr; 45235e3dd157SKalle Valo ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG); 45245e3dd157SKalle Valo ssids->num_ssids = __cpu_to_le32(arg->n_ssids); 45255e3dd157SKalle Valo 45265e3dd157SKalle Valo for (i = 0; i < arg->n_ssids; i++) { 45275e3dd157SKalle Valo ssids->ssids[i].ssid_len = 45285e3dd157SKalle Valo __cpu_to_le32(arg->ssids[i].len); 45295e3dd157SKalle Valo memcpy(&ssids->ssids[i].ssid, 45305e3dd157SKalle Valo arg->ssids[i].ssid, 45315e3dd157SKalle Valo arg->ssids[i].len); 45325e3dd157SKalle Valo } 45335e3dd157SKalle Valo 4534a6aa5da3SMichal Kazior ptr += sizeof(*ssids); 4535a6aa5da3SMichal Kazior ptr += sizeof(struct wmi_ssid) * arg->n_ssids; 45365e3dd157SKalle Valo } 45375e3dd157SKalle Valo 45385e3dd157SKalle Valo if (arg->n_bssids) { 4539a6aa5da3SMichal Kazior bssids = ptr; 45405e3dd157SKalle Valo bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG); 45415e3dd157SKalle Valo bssids->num_bssid = __cpu_to_le32(arg->n_bssids); 45425e3dd157SKalle Valo 45435e3dd157SKalle Valo for (i = 0; i < arg->n_bssids; i++) 45445e3dd157SKalle Valo memcpy(&bssids->bssid_list[i], 45455e3dd157SKalle Valo arg->bssids[i].bssid, 45465e3dd157SKalle Valo ETH_ALEN); 45475e3dd157SKalle Valo 4548a6aa5da3SMichal Kazior ptr += sizeof(*bssids); 4549a6aa5da3SMichal Kazior ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids; 45505e3dd157SKalle Valo } 45515e3dd157SKalle Valo 45525e3dd157SKalle Valo if (arg->ie_len) { 4553a6aa5da3SMichal Kazior ie = ptr; 45545e3dd157SKalle Valo ie->tag = __cpu_to_le32(WMI_IE_TAG); 45555e3dd157SKalle Valo ie->ie_len = __cpu_to_le32(arg->ie_len); 45565e3dd157SKalle Valo memcpy(ie->ie_data, arg->ie, arg->ie_len); 45575e3dd157SKalle Valo 4558a6aa5da3SMichal Kazior ptr += sizeof(*ie); 4559a6aa5da3SMichal Kazior ptr += roundup(arg->ie_len, 4); 4560a6aa5da3SMichal Kazior } 45615e3dd157SKalle Valo } 45625e3dd157SKalle Valo 4563d7579d12SMichal Kazior static struct sk_buff * 4564d7579d12SMichal Kazior ath10k_wmi_op_gen_start_scan(struct ath10k *ar, 4565a6aa5da3SMichal Kazior const struct wmi_start_scan_arg *arg) 4566a6aa5da3SMichal Kazior { 4567d7579d12SMichal Kazior struct wmi_start_scan_cmd *cmd; 4568a6aa5da3SMichal Kazior struct sk_buff *skb; 4569a6aa5da3SMichal Kazior size_t len; 4570a6aa5da3SMichal Kazior int ret; 4571a6aa5da3SMichal Kazior 4572a6aa5da3SMichal Kazior ret = ath10k_wmi_start_scan_verify(arg); 4573a6aa5da3SMichal Kazior if (ret) 4574d7579d12SMichal Kazior return ERR_PTR(ret); 4575a6aa5da3SMichal Kazior 4576d7579d12SMichal Kazior len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg); 4577a6aa5da3SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 4578a6aa5da3SMichal Kazior if (!skb) 4579d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 4580a6aa5da3SMichal Kazior 4581a6aa5da3SMichal Kazior cmd = (struct wmi_start_scan_cmd *)skb->data; 4582a6aa5da3SMichal Kazior 4583a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_common(&cmd->common, arg); 4584a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg); 4585d7579d12SMichal Kazior 4586d7579d12SMichal Kazior cmd->burst_duration_ms = __cpu_to_le32(0); 45875e3dd157SKalle Valo 45887aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n"); 4589d7579d12SMichal Kazior return skb; 4590d7579d12SMichal Kazior } 4591d7579d12SMichal Kazior 4592d7579d12SMichal Kazior static struct sk_buff * 4593d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar, 4594d7579d12SMichal Kazior const struct wmi_start_scan_arg *arg) 4595d7579d12SMichal Kazior { 4596d7579d12SMichal Kazior struct wmi_10x_start_scan_cmd *cmd; 4597d7579d12SMichal Kazior struct sk_buff *skb; 4598d7579d12SMichal Kazior size_t len; 4599d7579d12SMichal Kazior int ret; 4600d7579d12SMichal Kazior 4601d7579d12SMichal Kazior ret = ath10k_wmi_start_scan_verify(arg); 4602d7579d12SMichal Kazior if (ret) 4603d7579d12SMichal Kazior return ERR_PTR(ret); 4604d7579d12SMichal Kazior 4605d7579d12SMichal Kazior len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg); 4606d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 4607d7579d12SMichal Kazior if (!skb) 4608d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 4609d7579d12SMichal Kazior 4610d7579d12SMichal Kazior cmd = (struct wmi_10x_start_scan_cmd *)skb->data; 4611d7579d12SMichal Kazior 4612d7579d12SMichal Kazior ath10k_wmi_put_start_scan_common(&cmd->common, arg); 4613d7579d12SMichal Kazior ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg); 4614d7579d12SMichal Kazior 4615d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n"); 4616d7579d12SMichal Kazior return skb; 46175e3dd157SKalle Valo } 46185e3dd157SKalle Valo 46195e3dd157SKalle Valo void ath10k_wmi_start_scan_init(struct ath10k *ar, 46205e3dd157SKalle Valo struct wmi_start_scan_arg *arg) 46215e3dd157SKalle Valo { 46225e3dd157SKalle Valo /* setup commonly used values */ 46235e3dd157SKalle Valo arg->scan_req_id = 1; 46245e3dd157SKalle Valo arg->scan_priority = WMI_SCAN_PRIORITY_LOW; 46255e3dd157SKalle Valo arg->dwell_time_active = 50; 46265e3dd157SKalle Valo arg->dwell_time_passive = 150; 46275e3dd157SKalle Valo arg->min_rest_time = 50; 46285e3dd157SKalle Valo arg->max_rest_time = 500; 46295e3dd157SKalle Valo arg->repeat_probe_time = 0; 46305e3dd157SKalle Valo arg->probe_spacing_time = 0; 46315e3dd157SKalle Valo arg->idle_time = 0; 4632c322892fSBartosz Markowski arg->max_scan_time = 20000; 46335e3dd157SKalle Valo arg->probe_delay = 5; 46345e3dd157SKalle Valo arg->notify_scan_events = WMI_SCAN_EVENT_STARTED 46355e3dd157SKalle Valo | WMI_SCAN_EVENT_COMPLETED 46365e3dd157SKalle Valo | WMI_SCAN_EVENT_BSS_CHANNEL 46375e3dd157SKalle Valo | WMI_SCAN_EVENT_FOREIGN_CHANNEL 46385e3dd157SKalle Valo | WMI_SCAN_EVENT_DEQUEUED; 46395e3dd157SKalle Valo arg->scan_ctrl_flags |= WMI_SCAN_ADD_OFDM_RATES; 46405e3dd157SKalle Valo arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT; 46415e3dd157SKalle Valo arg->n_bssids = 1; 46425e3dd157SKalle Valo arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF"; 46435e3dd157SKalle Valo } 46445e3dd157SKalle Valo 4645d7579d12SMichal Kazior static struct sk_buff * 4646d7579d12SMichal Kazior ath10k_wmi_op_gen_stop_scan(struct ath10k *ar, 4647d7579d12SMichal Kazior const struct wmi_stop_scan_arg *arg) 46485e3dd157SKalle Valo { 46495e3dd157SKalle Valo struct wmi_stop_scan_cmd *cmd; 46505e3dd157SKalle Valo struct sk_buff *skb; 46515e3dd157SKalle Valo u32 scan_id; 46525e3dd157SKalle Valo u32 req_id; 46535e3dd157SKalle Valo 46545e3dd157SKalle Valo if (arg->req_id > 0xFFF) 4655d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 46565e3dd157SKalle Valo if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF) 4657d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 46585e3dd157SKalle Valo 46597aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 46605e3dd157SKalle Valo if (!skb) 4661d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 46625e3dd157SKalle Valo 46635e3dd157SKalle Valo scan_id = arg->u.scan_id; 46645e3dd157SKalle Valo scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX; 46655e3dd157SKalle Valo 46665e3dd157SKalle Valo req_id = arg->req_id; 46675e3dd157SKalle Valo req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX; 46685e3dd157SKalle Valo 46695e3dd157SKalle Valo cmd = (struct wmi_stop_scan_cmd *)skb->data; 46705e3dd157SKalle Valo cmd->req_type = __cpu_to_le32(arg->req_type); 46715e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->u.vdev_id); 46725e3dd157SKalle Valo cmd->scan_id = __cpu_to_le32(scan_id); 46735e3dd157SKalle Valo cmd->scan_req_id = __cpu_to_le32(req_id); 46745e3dd157SKalle Valo 46757aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 46765e3dd157SKalle Valo "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n", 46775e3dd157SKalle Valo arg->req_id, arg->req_type, arg->u.scan_id); 4678d7579d12SMichal Kazior return skb; 46795e3dd157SKalle Valo } 46805e3dd157SKalle Valo 4681d7579d12SMichal Kazior static struct sk_buff * 4682d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id, 46835e3dd157SKalle Valo enum wmi_vdev_type type, 46845e3dd157SKalle Valo enum wmi_vdev_subtype subtype, 46855e3dd157SKalle Valo const u8 macaddr[ETH_ALEN]) 46865e3dd157SKalle Valo { 46875e3dd157SKalle Valo struct wmi_vdev_create_cmd *cmd; 46885e3dd157SKalle Valo struct sk_buff *skb; 46895e3dd157SKalle Valo 46907aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 46915e3dd157SKalle Valo if (!skb) 4692d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 46935e3dd157SKalle Valo 46945e3dd157SKalle Valo cmd = (struct wmi_vdev_create_cmd *)skb->data; 46955e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 46965e3dd157SKalle Valo cmd->vdev_type = __cpu_to_le32(type); 46975e3dd157SKalle Valo cmd->vdev_subtype = __cpu_to_le32(subtype); 4698b25f32cbSKalle Valo ether_addr_copy(cmd->vdev_macaddr.addr, macaddr); 46995e3dd157SKalle Valo 47007aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 47015e3dd157SKalle Valo "WMI vdev create: id %d type %d subtype %d macaddr %pM\n", 47025e3dd157SKalle Valo vdev_id, type, subtype, macaddr); 4703d7579d12SMichal Kazior return skb; 47045e3dd157SKalle Valo } 47055e3dd157SKalle Valo 4706d7579d12SMichal Kazior static struct sk_buff * 4707d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id) 47085e3dd157SKalle Valo { 47095e3dd157SKalle Valo struct wmi_vdev_delete_cmd *cmd; 47105e3dd157SKalle Valo struct sk_buff *skb; 47115e3dd157SKalle Valo 47127aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 47135e3dd157SKalle Valo if (!skb) 4714d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 47155e3dd157SKalle Valo 47165e3dd157SKalle Valo cmd = (struct wmi_vdev_delete_cmd *)skb->data; 47175e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 47185e3dd157SKalle Valo 47197aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 47205e3dd157SKalle Valo "WMI vdev delete id %d\n", vdev_id); 4721d7579d12SMichal Kazior return skb; 47225e3dd157SKalle Valo } 47235e3dd157SKalle Valo 4724d7579d12SMichal Kazior static struct sk_buff * 4725d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_start(struct ath10k *ar, 47265e3dd157SKalle Valo const struct wmi_vdev_start_request_arg *arg, 4727d7579d12SMichal Kazior bool restart) 47285e3dd157SKalle Valo { 47295e3dd157SKalle Valo struct wmi_vdev_start_request_cmd *cmd; 47305e3dd157SKalle Valo struct sk_buff *skb; 47315e3dd157SKalle Valo const char *cmdname; 47325e3dd157SKalle Valo u32 flags = 0; 47335e3dd157SKalle Valo 47345e3dd157SKalle Valo if (WARN_ON(arg->hidden_ssid && !arg->ssid)) 4735d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 47365e3dd157SKalle Valo if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid))) 4737d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 47385e3dd157SKalle Valo 4739d7579d12SMichal Kazior if (restart) 47405e3dd157SKalle Valo cmdname = "restart"; 47415e3dd157SKalle Valo else 4742d7579d12SMichal Kazior cmdname = "start"; 47435e3dd157SKalle Valo 47447aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 47455e3dd157SKalle Valo if (!skb) 4746d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 47475e3dd157SKalle Valo 47485e3dd157SKalle Valo if (arg->hidden_ssid) 47495e3dd157SKalle Valo flags |= WMI_VDEV_START_HIDDEN_SSID; 47505e3dd157SKalle Valo if (arg->pmf_enabled) 47515e3dd157SKalle Valo flags |= WMI_VDEV_START_PMF_ENABLED; 47525e3dd157SKalle Valo 47535e3dd157SKalle Valo cmd = (struct wmi_vdev_start_request_cmd *)skb->data; 47545e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 47555e3dd157SKalle Valo cmd->disable_hw_ack = __cpu_to_le32(arg->disable_hw_ack); 47565e3dd157SKalle Valo cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval); 47575e3dd157SKalle Valo cmd->dtim_period = __cpu_to_le32(arg->dtim_period); 47585e3dd157SKalle Valo cmd->flags = __cpu_to_le32(flags); 47595e3dd157SKalle Valo cmd->bcn_tx_rate = __cpu_to_le32(arg->bcn_tx_rate); 47605e3dd157SKalle Valo cmd->bcn_tx_power = __cpu_to_le32(arg->bcn_tx_power); 47615e3dd157SKalle Valo 47625e3dd157SKalle Valo if (arg->ssid) { 47635e3dd157SKalle Valo cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len); 47645e3dd157SKalle Valo memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len); 47655e3dd157SKalle Valo } 47665e3dd157SKalle Valo 47672d66721cSMichal Kazior ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel); 47685e3dd157SKalle Valo 47697aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 47708cc7f26cSKalle Valo "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n", 47718cc7f26cSKalle Valo cmdname, arg->vdev_id, 4772e8a50f8bSMarek Puzyniak flags, arg->channel.freq, arg->channel.mode, 4773e8a50f8bSMarek Puzyniak cmd->chan.flags, arg->channel.max_power); 47745e3dd157SKalle Valo 4775d7579d12SMichal Kazior return skb; 47765e3dd157SKalle Valo } 47775e3dd157SKalle Valo 4778d7579d12SMichal Kazior static struct sk_buff * 4779d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id) 47805e3dd157SKalle Valo { 47815e3dd157SKalle Valo struct wmi_vdev_stop_cmd *cmd; 47825e3dd157SKalle Valo struct sk_buff *skb; 47835e3dd157SKalle Valo 47847aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 47855e3dd157SKalle Valo if (!skb) 4786d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 47875e3dd157SKalle Valo 47885e3dd157SKalle Valo cmd = (struct wmi_vdev_stop_cmd *)skb->data; 47895e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 47905e3dd157SKalle Valo 47917aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id); 4792d7579d12SMichal Kazior return skb; 47935e3dd157SKalle Valo } 47945e3dd157SKalle Valo 4795d7579d12SMichal Kazior static struct sk_buff * 4796d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, 4797d7579d12SMichal Kazior const u8 *bssid) 47985e3dd157SKalle Valo { 47995e3dd157SKalle Valo struct wmi_vdev_up_cmd *cmd; 48005e3dd157SKalle Valo struct sk_buff *skb; 48015e3dd157SKalle Valo 48027aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 48035e3dd157SKalle Valo if (!skb) 4804d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 48055e3dd157SKalle Valo 48065e3dd157SKalle Valo cmd = (struct wmi_vdev_up_cmd *)skb->data; 48075e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 48085e3dd157SKalle Valo cmd->vdev_assoc_id = __cpu_to_le32(aid); 4809b25f32cbSKalle Valo ether_addr_copy(cmd->vdev_bssid.addr, bssid); 48105e3dd157SKalle Valo 48117aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 48125e3dd157SKalle Valo "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n", 48135e3dd157SKalle Valo vdev_id, aid, bssid); 4814d7579d12SMichal Kazior return skb; 48155e3dd157SKalle Valo } 48165e3dd157SKalle Valo 4817d7579d12SMichal Kazior static struct sk_buff * 4818d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id) 48195e3dd157SKalle Valo { 48205e3dd157SKalle Valo struct wmi_vdev_down_cmd *cmd; 48215e3dd157SKalle Valo struct sk_buff *skb; 48225e3dd157SKalle Valo 48237aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 48245e3dd157SKalle Valo if (!skb) 4825d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 48265e3dd157SKalle Valo 48275e3dd157SKalle Valo cmd = (struct wmi_vdev_down_cmd *)skb->data; 48285e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 48295e3dd157SKalle Valo 48307aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 48315e3dd157SKalle Valo "wmi mgmt vdev down id 0x%x\n", vdev_id); 4832d7579d12SMichal Kazior return skb; 48335e3dd157SKalle Valo } 48345e3dd157SKalle Valo 4835d7579d12SMichal Kazior static struct sk_buff * 4836d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id, 48376d1506e7SBartosz Markowski u32 param_id, u32 param_value) 48385e3dd157SKalle Valo { 48395e3dd157SKalle Valo struct wmi_vdev_set_param_cmd *cmd; 48405e3dd157SKalle Valo struct sk_buff *skb; 48415e3dd157SKalle Valo 48426d1506e7SBartosz Markowski if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) { 48437aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 48446d1506e7SBartosz Markowski "vdev param %d not supported by firmware\n", 48456d1506e7SBartosz Markowski param_id); 4846d7579d12SMichal Kazior return ERR_PTR(-EOPNOTSUPP); 48476d1506e7SBartosz Markowski } 48486d1506e7SBartosz Markowski 48497aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 48505e3dd157SKalle Valo if (!skb) 4851d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 48525e3dd157SKalle Valo 48535e3dd157SKalle Valo cmd = (struct wmi_vdev_set_param_cmd *)skb->data; 48545e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 48555e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 48565e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(param_value); 48575e3dd157SKalle Valo 48587aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 48595e3dd157SKalle Valo "wmi vdev id 0x%x set param %d value %d\n", 48605e3dd157SKalle Valo vdev_id, param_id, param_value); 4861d7579d12SMichal Kazior return skb; 48625e3dd157SKalle Valo } 48635e3dd157SKalle Valo 4864d7579d12SMichal Kazior static struct sk_buff * 4865d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar, 48665e3dd157SKalle Valo const struct wmi_vdev_install_key_arg *arg) 48675e3dd157SKalle Valo { 48685e3dd157SKalle Valo struct wmi_vdev_install_key_cmd *cmd; 48695e3dd157SKalle Valo struct sk_buff *skb; 48705e3dd157SKalle Valo 48715e3dd157SKalle Valo if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL) 4872d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 48735e3dd157SKalle Valo if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL) 4874d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 48755e3dd157SKalle Valo 48767aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len); 48775e3dd157SKalle Valo if (!skb) 4878d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 48795e3dd157SKalle Valo 48805e3dd157SKalle Valo cmd = (struct wmi_vdev_install_key_cmd *)skb->data; 48815e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 48825e3dd157SKalle Valo cmd->key_idx = __cpu_to_le32(arg->key_idx); 48835e3dd157SKalle Valo cmd->key_flags = __cpu_to_le32(arg->key_flags); 48845e3dd157SKalle Valo cmd->key_cipher = __cpu_to_le32(arg->key_cipher); 48855e3dd157SKalle Valo cmd->key_len = __cpu_to_le32(arg->key_len); 48865e3dd157SKalle Valo cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len); 48875e3dd157SKalle Valo cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len); 48885e3dd157SKalle Valo 48895e3dd157SKalle Valo if (arg->macaddr) 4890b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr); 48915e3dd157SKalle Valo if (arg->key_data) 48925e3dd157SKalle Valo memcpy(cmd->key_data, arg->key_data, arg->key_len); 48935e3dd157SKalle Valo 48947aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 4895e0c508abSMichal Kazior "wmi vdev install key idx %d cipher %d len %d\n", 4896e0c508abSMichal Kazior arg->key_idx, arg->key_cipher, arg->key_len); 4897d7579d12SMichal Kazior return skb; 48985e3dd157SKalle Valo } 48995e3dd157SKalle Valo 4900d7579d12SMichal Kazior static struct sk_buff * 4901d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar, 4902855aed12SSimon Wunderlich const struct wmi_vdev_spectral_conf_arg *arg) 4903855aed12SSimon Wunderlich { 4904855aed12SSimon Wunderlich struct wmi_vdev_spectral_conf_cmd *cmd; 4905855aed12SSimon Wunderlich struct sk_buff *skb; 4906855aed12SSimon Wunderlich 49077aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 4908855aed12SSimon Wunderlich if (!skb) 4909d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 4910855aed12SSimon Wunderlich 4911855aed12SSimon Wunderlich cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data; 4912855aed12SSimon Wunderlich cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 4913855aed12SSimon Wunderlich cmd->scan_count = __cpu_to_le32(arg->scan_count); 4914855aed12SSimon Wunderlich cmd->scan_period = __cpu_to_le32(arg->scan_period); 4915855aed12SSimon Wunderlich cmd->scan_priority = __cpu_to_le32(arg->scan_priority); 4916855aed12SSimon Wunderlich cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size); 4917855aed12SSimon Wunderlich cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena); 4918855aed12SSimon Wunderlich cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena); 4919855aed12SSimon Wunderlich cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref); 4920855aed12SSimon Wunderlich cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay); 4921855aed12SSimon Wunderlich cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr); 4922855aed12SSimon Wunderlich cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr); 4923855aed12SSimon Wunderlich cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode); 4924855aed12SSimon Wunderlich cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode); 4925855aed12SSimon Wunderlich cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr); 4926855aed12SSimon Wunderlich cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format); 4927855aed12SSimon Wunderlich cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode); 4928855aed12SSimon Wunderlich cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale); 4929855aed12SSimon Wunderlich cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj); 4930855aed12SSimon Wunderlich cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask); 4931855aed12SSimon Wunderlich 4932d7579d12SMichal Kazior return skb; 4933855aed12SSimon Wunderlich } 4934855aed12SSimon Wunderlich 4935d7579d12SMichal Kazior static struct sk_buff * 4936d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, 4937d7579d12SMichal Kazior u32 trigger, u32 enable) 4938855aed12SSimon Wunderlich { 4939855aed12SSimon Wunderlich struct wmi_vdev_spectral_enable_cmd *cmd; 4940855aed12SSimon Wunderlich struct sk_buff *skb; 4941855aed12SSimon Wunderlich 49427aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 4943855aed12SSimon Wunderlich if (!skb) 4944d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 4945855aed12SSimon Wunderlich 4946855aed12SSimon Wunderlich cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data; 4947855aed12SSimon Wunderlich cmd->vdev_id = __cpu_to_le32(vdev_id); 4948855aed12SSimon Wunderlich cmd->trigger_cmd = __cpu_to_le32(trigger); 4949855aed12SSimon Wunderlich cmd->enable_cmd = __cpu_to_le32(enable); 4950855aed12SSimon Wunderlich 4951d7579d12SMichal Kazior return skb; 4952855aed12SSimon Wunderlich } 4953855aed12SSimon Wunderlich 4954d7579d12SMichal Kazior static struct sk_buff * 4955d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id, 49567390ed34SMarek Puzyniak const u8 peer_addr[ETH_ALEN], 49577390ed34SMarek Puzyniak enum wmi_peer_type peer_type) 49585e3dd157SKalle Valo { 49595e3dd157SKalle Valo struct wmi_peer_create_cmd *cmd; 49605e3dd157SKalle Valo struct sk_buff *skb; 49615e3dd157SKalle Valo 49627aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 49635e3dd157SKalle Valo if (!skb) 4964d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 49655e3dd157SKalle Valo 49665e3dd157SKalle Valo cmd = (struct wmi_peer_create_cmd *)skb->data; 49675e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 4968b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 49695e3dd157SKalle Valo 49707aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 49715e3dd157SKalle Valo "wmi peer create vdev_id %d peer_addr %pM\n", 49725e3dd157SKalle Valo vdev_id, peer_addr); 4973d7579d12SMichal Kazior return skb; 49745e3dd157SKalle Valo } 49755e3dd157SKalle Valo 4976d7579d12SMichal Kazior static struct sk_buff * 4977d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id, 49785e3dd157SKalle Valo const u8 peer_addr[ETH_ALEN]) 49795e3dd157SKalle Valo { 49805e3dd157SKalle Valo struct wmi_peer_delete_cmd *cmd; 49815e3dd157SKalle Valo struct sk_buff *skb; 49825e3dd157SKalle Valo 49837aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 49845e3dd157SKalle Valo if (!skb) 4985d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 49865e3dd157SKalle Valo 49875e3dd157SKalle Valo cmd = (struct wmi_peer_delete_cmd *)skb->data; 49885e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 4989b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 49905e3dd157SKalle Valo 49917aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 49925e3dd157SKalle Valo "wmi peer delete vdev_id %d peer_addr %pM\n", 49935e3dd157SKalle Valo vdev_id, peer_addr); 4994d7579d12SMichal Kazior return skb; 49955e3dd157SKalle Valo } 49965e3dd157SKalle Valo 4997d7579d12SMichal Kazior static struct sk_buff * 4998d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id, 49995e3dd157SKalle Valo const u8 peer_addr[ETH_ALEN], u32 tid_bitmap) 50005e3dd157SKalle Valo { 50015e3dd157SKalle Valo struct wmi_peer_flush_tids_cmd *cmd; 50025e3dd157SKalle Valo struct sk_buff *skb; 50035e3dd157SKalle Valo 50047aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 50055e3dd157SKalle Valo if (!skb) 5006d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 50075e3dd157SKalle Valo 50085e3dd157SKalle Valo cmd = (struct wmi_peer_flush_tids_cmd *)skb->data; 50095e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 50105e3dd157SKalle Valo cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap); 5011b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 50125e3dd157SKalle Valo 50137aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 50145e3dd157SKalle Valo "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n", 50155e3dd157SKalle Valo vdev_id, peer_addr, tid_bitmap); 5016d7579d12SMichal Kazior return skb; 50175e3dd157SKalle Valo } 50185e3dd157SKalle Valo 5019d7579d12SMichal Kazior static struct sk_buff * 5020d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id, 5021d7579d12SMichal Kazior const u8 *peer_addr, 5022d7579d12SMichal Kazior enum wmi_peer_param param_id, 50235e3dd157SKalle Valo u32 param_value) 50245e3dd157SKalle Valo { 50255e3dd157SKalle Valo struct wmi_peer_set_param_cmd *cmd; 50265e3dd157SKalle Valo struct sk_buff *skb; 50275e3dd157SKalle Valo 50287aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 50295e3dd157SKalle Valo if (!skb) 5030d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 50315e3dd157SKalle Valo 50325e3dd157SKalle Valo cmd = (struct wmi_peer_set_param_cmd *)skb->data; 50335e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 50345e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 50355e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(param_value); 5036b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 50375e3dd157SKalle Valo 50387aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 50395e3dd157SKalle Valo "wmi vdev %d peer 0x%pM set param %d value %d\n", 50405e3dd157SKalle Valo vdev_id, peer_addr, param_id, param_value); 5041d7579d12SMichal Kazior return skb; 50425e3dd157SKalle Valo } 50435e3dd157SKalle Valo 5044d7579d12SMichal Kazior static struct sk_buff * 5045d7579d12SMichal Kazior ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, 50465e3dd157SKalle Valo enum wmi_sta_ps_mode psmode) 50475e3dd157SKalle Valo { 50485e3dd157SKalle Valo struct wmi_sta_powersave_mode_cmd *cmd; 50495e3dd157SKalle Valo struct sk_buff *skb; 50505e3dd157SKalle Valo 50517aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 50525e3dd157SKalle Valo if (!skb) 5053d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 50545e3dd157SKalle Valo 50555e3dd157SKalle Valo cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data; 50565e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 50575e3dd157SKalle Valo cmd->sta_ps_mode = __cpu_to_le32(psmode); 50585e3dd157SKalle Valo 50597aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 50605e3dd157SKalle Valo "wmi set powersave id 0x%x mode %d\n", 50615e3dd157SKalle Valo vdev_id, psmode); 5062d7579d12SMichal Kazior return skb; 50635e3dd157SKalle Valo } 50645e3dd157SKalle Valo 5065d7579d12SMichal Kazior static struct sk_buff * 5066d7579d12SMichal Kazior ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id, 50675e3dd157SKalle Valo enum wmi_sta_powersave_param param_id, 50685e3dd157SKalle Valo u32 value) 50695e3dd157SKalle Valo { 50705e3dd157SKalle Valo struct wmi_sta_powersave_param_cmd *cmd; 50715e3dd157SKalle Valo struct sk_buff *skb; 50725e3dd157SKalle Valo 50737aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 50745e3dd157SKalle Valo if (!skb) 5075d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 50765e3dd157SKalle Valo 50775e3dd157SKalle Valo cmd = (struct wmi_sta_powersave_param_cmd *)skb->data; 50785e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 50795e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 50805e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(value); 50815e3dd157SKalle Valo 50827aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 50835e3dd157SKalle Valo "wmi sta ps param vdev_id 0x%x param %d value %d\n", 50845e3dd157SKalle Valo vdev_id, param_id, value); 5085d7579d12SMichal Kazior return skb; 50865e3dd157SKalle Valo } 50875e3dd157SKalle Valo 5088d7579d12SMichal Kazior static struct sk_buff * 5089d7579d12SMichal Kazior ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac, 50905e3dd157SKalle Valo enum wmi_ap_ps_peer_param param_id, u32 value) 50915e3dd157SKalle Valo { 50925e3dd157SKalle Valo struct wmi_ap_ps_peer_cmd *cmd; 50935e3dd157SKalle Valo struct sk_buff *skb; 50945e3dd157SKalle Valo 50955e3dd157SKalle Valo if (!mac) 5096d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 50975e3dd157SKalle Valo 50987aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 50995e3dd157SKalle Valo if (!skb) 5100d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 51015e3dd157SKalle Valo 51025e3dd157SKalle Valo cmd = (struct wmi_ap_ps_peer_cmd *)skb->data; 51035e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 51045e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 51055e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(value); 5106b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, mac); 51075e3dd157SKalle Valo 51087aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 51095e3dd157SKalle Valo "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n", 51105e3dd157SKalle Valo vdev_id, param_id, value, mac); 5111d7579d12SMichal Kazior return skb; 51125e3dd157SKalle Valo } 51135e3dd157SKalle Valo 5114d7579d12SMichal Kazior static struct sk_buff * 5115d7579d12SMichal Kazior ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar, 51165e3dd157SKalle Valo const struct wmi_scan_chan_list_arg *arg) 51175e3dd157SKalle Valo { 51185e3dd157SKalle Valo struct wmi_scan_chan_list_cmd *cmd; 51195e3dd157SKalle Valo struct sk_buff *skb; 51205e3dd157SKalle Valo struct wmi_channel_arg *ch; 51215e3dd157SKalle Valo struct wmi_channel *ci; 51225e3dd157SKalle Valo int len; 51235e3dd157SKalle Valo int i; 51245e3dd157SKalle Valo 51255e3dd157SKalle Valo len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel); 51265e3dd157SKalle Valo 51277aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 51285e3dd157SKalle Valo if (!skb) 5129d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 51305e3dd157SKalle Valo 51315e3dd157SKalle Valo cmd = (struct wmi_scan_chan_list_cmd *)skb->data; 51325e3dd157SKalle Valo cmd->num_scan_chans = __cpu_to_le32(arg->n_channels); 51335e3dd157SKalle Valo 51345e3dd157SKalle Valo for (i = 0; i < arg->n_channels; i++) { 51355e3dd157SKalle Valo ch = &arg->channels[i]; 51365e3dd157SKalle Valo ci = &cmd->chan_info[i]; 51375e3dd157SKalle Valo 51382d66721cSMichal Kazior ath10k_wmi_put_wmi_channel(ci, ch); 51395e3dd157SKalle Valo } 51405e3dd157SKalle Valo 5141d7579d12SMichal Kazior return skb; 51425e3dd157SKalle Valo } 51435e3dd157SKalle Valo 514424c88f78SMichal Kazior static void 514524c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf, 51465e3dd157SKalle Valo const struct wmi_peer_assoc_complete_arg *arg) 51475e3dd157SKalle Valo { 514824c88f78SMichal Kazior struct wmi_common_peer_assoc_complete_cmd *cmd = buf; 51495e3dd157SKalle Valo 51505e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 51515e3dd157SKalle Valo cmd->peer_new_assoc = __cpu_to_le32(arg->peer_reassoc ? 0 : 1); 51525e3dd157SKalle Valo cmd->peer_associd = __cpu_to_le32(arg->peer_aid); 51535e3dd157SKalle Valo cmd->peer_flags = __cpu_to_le32(arg->peer_flags); 51545e3dd157SKalle Valo cmd->peer_caps = __cpu_to_le32(arg->peer_caps); 51555e3dd157SKalle Valo cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval); 51565e3dd157SKalle Valo cmd->peer_ht_caps = __cpu_to_le32(arg->peer_ht_caps); 51575e3dd157SKalle Valo cmd->peer_max_mpdu = __cpu_to_le32(arg->peer_max_mpdu); 51585e3dd157SKalle Valo cmd->peer_mpdu_density = __cpu_to_le32(arg->peer_mpdu_density); 51595e3dd157SKalle Valo cmd->peer_rate_caps = __cpu_to_le32(arg->peer_rate_caps); 51605e3dd157SKalle Valo cmd->peer_nss = __cpu_to_le32(arg->peer_num_spatial_streams); 51615e3dd157SKalle Valo cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps); 51625e3dd157SKalle Valo cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode); 51635e3dd157SKalle Valo 5164b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, arg->addr); 51655e3dd157SKalle Valo 51665e3dd157SKalle Valo cmd->peer_legacy_rates.num_rates = 51675e3dd157SKalle Valo __cpu_to_le32(arg->peer_legacy_rates.num_rates); 51685e3dd157SKalle Valo memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates, 51695e3dd157SKalle Valo arg->peer_legacy_rates.num_rates); 51705e3dd157SKalle Valo 51715e3dd157SKalle Valo cmd->peer_ht_rates.num_rates = 51725e3dd157SKalle Valo __cpu_to_le32(arg->peer_ht_rates.num_rates); 51735e3dd157SKalle Valo memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates, 51745e3dd157SKalle Valo arg->peer_ht_rates.num_rates); 51755e3dd157SKalle Valo 51765e3dd157SKalle Valo cmd->peer_vht_rates.rx_max_rate = 51775e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.rx_max_rate); 51785e3dd157SKalle Valo cmd->peer_vht_rates.rx_mcs_set = 51795e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.rx_mcs_set); 51805e3dd157SKalle Valo cmd->peer_vht_rates.tx_max_rate = 51815e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.tx_max_rate); 51825e3dd157SKalle Valo cmd->peer_vht_rates.tx_mcs_set = 51835e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set); 518424c88f78SMichal Kazior } 518524c88f78SMichal Kazior 518624c88f78SMichal Kazior static void 518724c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf, 518824c88f78SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 518924c88f78SMichal Kazior { 519024c88f78SMichal Kazior struct wmi_main_peer_assoc_complete_cmd *cmd = buf; 519124c88f78SMichal Kazior 519224c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(ar, buf, arg); 519324c88f78SMichal Kazior memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info)); 519424c88f78SMichal Kazior } 519524c88f78SMichal Kazior 519624c88f78SMichal Kazior static void 519724c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf, 519824c88f78SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 519924c88f78SMichal Kazior { 520024c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(ar, buf, arg); 520124c88f78SMichal Kazior } 520224c88f78SMichal Kazior 520324c88f78SMichal Kazior static void 520424c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf, 520524c88f78SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 520624c88f78SMichal Kazior { 520724c88f78SMichal Kazior struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf; 520824c88f78SMichal Kazior int max_mcs, max_nss; 520924c88f78SMichal Kazior u32 info0; 521024c88f78SMichal Kazior 521124c88f78SMichal Kazior /* TODO: Is using max values okay with firmware? */ 521224c88f78SMichal Kazior max_mcs = 0xf; 521324c88f78SMichal Kazior max_nss = 0xf; 521424c88f78SMichal Kazior 521524c88f78SMichal Kazior info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) | 521624c88f78SMichal Kazior SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS); 521724c88f78SMichal Kazior 521824c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(ar, buf, arg); 521924c88f78SMichal Kazior cmd->info0 = __cpu_to_le32(info0); 522024c88f78SMichal Kazior } 522124c88f78SMichal Kazior 5222d7579d12SMichal Kazior static int 5223d7579d12SMichal Kazior ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg) 522424c88f78SMichal Kazior { 522524c88f78SMichal Kazior if (arg->peer_mpdu_density > 16) 522624c88f78SMichal Kazior return -EINVAL; 522724c88f78SMichal Kazior if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES) 522824c88f78SMichal Kazior return -EINVAL; 522924c88f78SMichal Kazior if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES) 523024c88f78SMichal Kazior return -EINVAL; 523124c88f78SMichal Kazior 5232d7579d12SMichal Kazior return 0; 523324c88f78SMichal Kazior } 523424c88f78SMichal Kazior 5235d7579d12SMichal Kazior static struct sk_buff * 5236d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar, 5237d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 5238d7579d12SMichal Kazior { 5239d7579d12SMichal Kazior size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd); 5240d7579d12SMichal Kazior struct sk_buff *skb; 5241d7579d12SMichal Kazior int ret; 5242d7579d12SMichal Kazior 5243d7579d12SMichal Kazior ret = ath10k_wmi_peer_assoc_check_arg(arg); 5244d7579d12SMichal Kazior if (ret) 5245d7579d12SMichal Kazior return ERR_PTR(ret); 5246d7579d12SMichal Kazior 52477aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 524824c88f78SMichal Kazior if (!skb) 5249d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 525024c88f78SMichal Kazior 525124c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg); 52525e3dd157SKalle Valo 52537aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 525444d6fa90SChun-Yeow Yeoh "wmi peer assoc vdev %d addr %pM (%s)\n", 525544d6fa90SChun-Yeow Yeoh arg->vdev_id, arg->addr, 525644d6fa90SChun-Yeow Yeoh arg->peer_reassoc ? "reassociate" : "new"); 5257d7579d12SMichal Kazior return skb; 5258d7579d12SMichal Kazior } 5259d7579d12SMichal Kazior 5260d7579d12SMichal Kazior static struct sk_buff * 5261d7579d12SMichal Kazior ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar, 5262d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 5263d7579d12SMichal Kazior { 5264d7579d12SMichal Kazior size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd); 5265d7579d12SMichal Kazior struct sk_buff *skb; 5266d7579d12SMichal Kazior int ret; 5267d7579d12SMichal Kazior 5268d7579d12SMichal Kazior ret = ath10k_wmi_peer_assoc_check_arg(arg); 5269d7579d12SMichal Kazior if (ret) 5270d7579d12SMichal Kazior return ERR_PTR(ret); 5271d7579d12SMichal Kazior 5272d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 5273d7579d12SMichal Kazior if (!skb) 5274d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 5275d7579d12SMichal Kazior 5276d7579d12SMichal Kazior ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg); 5277d7579d12SMichal Kazior 5278d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 5279d7579d12SMichal Kazior "wmi peer assoc vdev %d addr %pM (%s)\n", 5280d7579d12SMichal Kazior arg->vdev_id, arg->addr, 5281d7579d12SMichal Kazior arg->peer_reassoc ? "reassociate" : "new"); 5282d7579d12SMichal Kazior return skb; 5283d7579d12SMichal Kazior } 5284d7579d12SMichal Kazior 5285d7579d12SMichal Kazior static struct sk_buff * 5286d7579d12SMichal Kazior ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar, 5287d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 5288d7579d12SMichal Kazior { 5289d7579d12SMichal Kazior size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd); 5290d7579d12SMichal Kazior struct sk_buff *skb; 5291d7579d12SMichal Kazior int ret; 5292d7579d12SMichal Kazior 5293d7579d12SMichal Kazior ret = ath10k_wmi_peer_assoc_check_arg(arg); 5294d7579d12SMichal Kazior if (ret) 5295d7579d12SMichal Kazior return ERR_PTR(ret); 5296d7579d12SMichal Kazior 5297d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 5298d7579d12SMichal Kazior if (!skb) 5299d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 5300d7579d12SMichal Kazior 5301d7579d12SMichal Kazior ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg); 5302d7579d12SMichal Kazior 5303d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 5304d7579d12SMichal Kazior "wmi peer assoc vdev %d addr %pM (%s)\n", 5305d7579d12SMichal Kazior arg->vdev_id, arg->addr, 5306d7579d12SMichal Kazior arg->peer_reassoc ? "reassociate" : "new"); 5307d7579d12SMichal Kazior return skb; 53085e3dd157SKalle Valo } 53095e3dd157SKalle Valo 5310a57a6a27SRajkumar Manoharan static struct sk_buff * 5311a57a6a27SRajkumar Manoharan ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar) 5312a57a6a27SRajkumar Manoharan { 5313a57a6a27SRajkumar Manoharan struct sk_buff *skb; 5314a57a6a27SRajkumar Manoharan 5315a57a6a27SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, 0); 5316a57a6a27SRajkumar Manoharan if (!skb) 5317a57a6a27SRajkumar Manoharan return ERR_PTR(-ENOMEM); 5318a57a6a27SRajkumar Manoharan 5319a57a6a27SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n"); 5320a57a6a27SRajkumar Manoharan return skb; 5321a57a6a27SRajkumar Manoharan } 5322a57a6a27SRajkumar Manoharan 5323748afc47SMichal Kazior /* This function assumes the beacon is already DMA mapped */ 5324d7579d12SMichal Kazior static struct sk_buff * 53259ad50182SMichal Kazior ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn, 53269ad50182SMichal Kazior size_t bcn_len, u32 bcn_paddr, bool dtim_zero, 53279ad50182SMichal Kazior bool deliver_cab) 53285e3dd157SKalle Valo { 5329748afc47SMichal Kazior struct wmi_bcn_tx_ref_cmd *cmd; 53305e3dd157SKalle Valo struct sk_buff *skb; 5331748afc47SMichal Kazior struct ieee80211_hdr *hdr; 5332748afc47SMichal Kazior u16 fc; 53335e3dd157SKalle Valo 53347aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 53355e3dd157SKalle Valo if (!skb) 5336d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 53375e3dd157SKalle Valo 53389ad50182SMichal Kazior hdr = (struct ieee80211_hdr *)bcn; 5339748afc47SMichal Kazior fc = le16_to_cpu(hdr->frame_control); 53405e3dd157SKalle Valo 5341748afc47SMichal Kazior cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data; 53429ad50182SMichal Kazior cmd->vdev_id = __cpu_to_le32(vdev_id); 53439ad50182SMichal Kazior cmd->data_len = __cpu_to_le32(bcn_len); 53449ad50182SMichal Kazior cmd->data_ptr = __cpu_to_le32(bcn_paddr); 5345748afc47SMichal Kazior cmd->msdu_id = 0; 5346748afc47SMichal Kazior cmd->frame_control = __cpu_to_le32(fc); 5347748afc47SMichal Kazior cmd->flags = 0; 534824c88f78SMichal Kazior cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA); 5349748afc47SMichal Kazior 53509ad50182SMichal Kazior if (dtim_zero) 5351748afc47SMichal Kazior cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO); 5352748afc47SMichal Kazior 53539ad50182SMichal Kazior if (deliver_cab) 5354748afc47SMichal Kazior cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB); 5355748afc47SMichal Kazior 5356d7579d12SMichal Kazior return skb; 53575e3dd157SKalle Valo } 53585e3dd157SKalle Valo 53595e752e42SMichal Kazior void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params, 53605e3dd157SKalle Valo const struct wmi_wmm_params_arg *arg) 53615e3dd157SKalle Valo { 53625e3dd157SKalle Valo params->cwmin = __cpu_to_le32(arg->cwmin); 53635e3dd157SKalle Valo params->cwmax = __cpu_to_le32(arg->cwmax); 53645e3dd157SKalle Valo params->aifs = __cpu_to_le32(arg->aifs); 53655e3dd157SKalle Valo params->txop = __cpu_to_le32(arg->txop); 53665e3dd157SKalle Valo params->acm = __cpu_to_le32(arg->acm); 53675e3dd157SKalle Valo params->no_ack = __cpu_to_le32(arg->no_ack); 53685e3dd157SKalle Valo } 53695e3dd157SKalle Valo 5370d7579d12SMichal Kazior static struct sk_buff * 5371d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar, 53725e752e42SMichal Kazior const struct wmi_wmm_params_all_arg *arg) 53735e3dd157SKalle Valo { 53745e3dd157SKalle Valo struct wmi_pdev_set_wmm_params *cmd; 53755e3dd157SKalle Valo struct sk_buff *skb; 53765e3dd157SKalle Valo 53777aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 53785e3dd157SKalle Valo if (!skb) 5379d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 53805e3dd157SKalle Valo 53815e3dd157SKalle Valo cmd = (struct wmi_pdev_set_wmm_params *)skb->data; 53825e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be); 53835e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk); 53845e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi); 53855e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo); 53865e3dd157SKalle Valo 53877aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n"); 5388d7579d12SMichal Kazior return skb; 53895e3dd157SKalle Valo } 53905e3dd157SKalle Valo 5391d7579d12SMichal Kazior static struct sk_buff * 5392de23d3efSMichal Kazior ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask) 53935e3dd157SKalle Valo { 53945e3dd157SKalle Valo struct wmi_request_stats_cmd *cmd; 53955e3dd157SKalle Valo struct sk_buff *skb; 53965e3dd157SKalle Valo 53977aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 53985e3dd157SKalle Valo if (!skb) 5399d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 54005e3dd157SKalle Valo 54015e3dd157SKalle Valo cmd = (struct wmi_request_stats_cmd *)skb->data; 5402de23d3efSMichal Kazior cmd->stats_id = __cpu_to_le32(stats_mask); 54035e3dd157SKalle Valo 5404de23d3efSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n", 5405de23d3efSMichal Kazior stats_mask); 5406d7579d12SMichal Kazior return skb; 54075e3dd157SKalle Valo } 54089cfbce75SMichal Kazior 5409d7579d12SMichal Kazior static struct sk_buff * 5410d7579d12SMichal Kazior ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar, 54119cfbce75SMichal Kazior enum wmi_force_fw_hang_type type, u32 delay_ms) 54129cfbce75SMichal Kazior { 54139cfbce75SMichal Kazior struct wmi_force_fw_hang_cmd *cmd; 54149cfbce75SMichal Kazior struct sk_buff *skb; 54159cfbce75SMichal Kazior 54167aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 54179cfbce75SMichal Kazior if (!skb) 5418d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 54199cfbce75SMichal Kazior 54209cfbce75SMichal Kazior cmd = (struct wmi_force_fw_hang_cmd *)skb->data; 54219cfbce75SMichal Kazior cmd->type = __cpu_to_le32(type); 54229cfbce75SMichal Kazior cmd->delay_ms = __cpu_to_le32(delay_ms); 54239cfbce75SMichal Kazior 54247aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n", 54259cfbce75SMichal Kazior type, delay_ms); 5426d7579d12SMichal Kazior return skb; 54279cfbce75SMichal Kazior } 5428f118a3e5SKalle Valo 5429d7579d12SMichal Kazior static struct sk_buff * 5430467210a6SSenthilKumar Jegadeesan ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u32 module_enable, 5431467210a6SSenthilKumar Jegadeesan u32 log_level) 5432f118a3e5SKalle Valo { 5433f118a3e5SKalle Valo struct wmi_dbglog_cfg_cmd *cmd; 5434f118a3e5SKalle Valo struct sk_buff *skb; 5435f118a3e5SKalle Valo u32 cfg; 5436f118a3e5SKalle Valo 54377aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 5438f118a3e5SKalle Valo if (!skb) 5439d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 5440f118a3e5SKalle Valo 5441f118a3e5SKalle Valo cmd = (struct wmi_dbglog_cfg_cmd *)skb->data; 5442f118a3e5SKalle Valo 5443f118a3e5SKalle Valo if (module_enable) { 5444467210a6SSenthilKumar Jegadeesan cfg = SM(log_level, 5445f118a3e5SKalle Valo ATH10K_DBGLOG_CFG_LOG_LVL); 5446f118a3e5SKalle Valo } else { 5447f118a3e5SKalle Valo /* set back defaults, all modules with WARN level */ 5448f118a3e5SKalle Valo cfg = SM(ATH10K_DBGLOG_LEVEL_WARN, 5449f118a3e5SKalle Valo ATH10K_DBGLOG_CFG_LOG_LVL); 5450f118a3e5SKalle Valo module_enable = ~0; 5451f118a3e5SKalle Valo } 5452f118a3e5SKalle Valo 5453f118a3e5SKalle Valo cmd->module_enable = __cpu_to_le32(module_enable); 5454f118a3e5SKalle Valo cmd->module_valid = __cpu_to_le32(~0); 5455f118a3e5SKalle Valo cmd->config_enable = __cpu_to_le32(cfg); 5456f118a3e5SKalle Valo cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK); 5457f118a3e5SKalle Valo 54587aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 5459f118a3e5SKalle Valo "wmi dbglog cfg modules %08x %08x config %08x %08x\n", 5460f118a3e5SKalle Valo __le32_to_cpu(cmd->module_enable), 5461f118a3e5SKalle Valo __le32_to_cpu(cmd->module_valid), 5462f118a3e5SKalle Valo __le32_to_cpu(cmd->config_enable), 5463f118a3e5SKalle Valo __le32_to_cpu(cmd->config_valid)); 5464d7579d12SMichal Kazior return skb; 5465f118a3e5SKalle Valo } 5466b79b9baaSMichal Kazior 5467d7579d12SMichal Kazior static struct sk_buff * 5468d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap) 546990174455SRajkumar Manoharan { 547090174455SRajkumar Manoharan struct wmi_pdev_pktlog_enable_cmd *cmd; 547190174455SRajkumar Manoharan struct sk_buff *skb; 547290174455SRajkumar Manoharan 547390174455SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 547490174455SRajkumar Manoharan if (!skb) 5475d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 547690174455SRajkumar Manoharan 547790174455SRajkumar Manoharan ev_bitmap &= ATH10K_PKTLOG_ANY; 547890174455SRajkumar Manoharan 547990174455SRajkumar Manoharan cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data; 548090174455SRajkumar Manoharan cmd->ev_bitmap = __cpu_to_le32(ev_bitmap); 5481d7579d12SMichal Kazior 5482d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n", 5483d7579d12SMichal Kazior ev_bitmap); 5484d7579d12SMichal Kazior return skb; 548590174455SRajkumar Manoharan } 548690174455SRajkumar Manoharan 5487d7579d12SMichal Kazior static struct sk_buff * 5488d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar) 548990174455SRajkumar Manoharan { 549090174455SRajkumar Manoharan struct sk_buff *skb; 549190174455SRajkumar Manoharan 549290174455SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, 0); 549390174455SRajkumar Manoharan if (!skb) 5494d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 549590174455SRajkumar Manoharan 549690174455SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n"); 5497d7579d12SMichal Kazior return skb; 549890174455SRajkumar Manoharan } 549990174455SRajkumar Manoharan 5500ffdd738dSRajkumar Manoharan static struct sk_buff * 5501ffdd738dSRajkumar Manoharan ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period, 5502ffdd738dSRajkumar Manoharan u32 duration, u32 next_offset, 5503ffdd738dSRajkumar Manoharan u32 enabled) 5504ffdd738dSRajkumar Manoharan { 5505ffdd738dSRajkumar Manoharan struct wmi_pdev_set_quiet_cmd *cmd; 5506ffdd738dSRajkumar Manoharan struct sk_buff *skb; 5507ffdd738dSRajkumar Manoharan 5508ffdd738dSRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 5509ffdd738dSRajkumar Manoharan if (!skb) 5510ffdd738dSRajkumar Manoharan return ERR_PTR(-ENOMEM); 5511ffdd738dSRajkumar Manoharan 5512ffdd738dSRajkumar Manoharan cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data; 5513ffdd738dSRajkumar Manoharan cmd->period = __cpu_to_le32(period); 5514ffdd738dSRajkumar Manoharan cmd->duration = __cpu_to_le32(duration); 5515ffdd738dSRajkumar Manoharan cmd->next_start = __cpu_to_le32(next_offset); 5516ffdd738dSRajkumar Manoharan cmd->enabled = __cpu_to_le32(enabled); 5517ffdd738dSRajkumar Manoharan 5518ffdd738dSRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 5519ffdd738dSRajkumar Manoharan "wmi quiet param: period %u duration %u enabled %d\n", 5520ffdd738dSRajkumar Manoharan period, duration, enabled); 5521ffdd738dSRajkumar Manoharan return skb; 5522ffdd738dSRajkumar Manoharan } 5523ffdd738dSRajkumar Manoharan 5524dc8ab278SRajkumar Manoharan static struct sk_buff * 5525dc8ab278SRajkumar Manoharan ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id, 5526dc8ab278SRajkumar Manoharan const u8 *mac) 5527dc8ab278SRajkumar Manoharan { 5528dc8ab278SRajkumar Manoharan struct wmi_addba_clear_resp_cmd *cmd; 5529dc8ab278SRajkumar Manoharan struct sk_buff *skb; 5530dc8ab278SRajkumar Manoharan 5531dc8ab278SRajkumar Manoharan if (!mac) 5532dc8ab278SRajkumar Manoharan return ERR_PTR(-EINVAL); 5533dc8ab278SRajkumar Manoharan 5534dc8ab278SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 5535dc8ab278SRajkumar Manoharan if (!skb) 5536dc8ab278SRajkumar Manoharan return ERR_PTR(-ENOMEM); 5537dc8ab278SRajkumar Manoharan 5538dc8ab278SRajkumar Manoharan cmd = (struct wmi_addba_clear_resp_cmd *)skb->data; 5539dc8ab278SRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 5540dc8ab278SRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 5541dc8ab278SRajkumar Manoharan 5542dc8ab278SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 5543dc8ab278SRajkumar Manoharan "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n", 5544dc8ab278SRajkumar Manoharan vdev_id, mac); 5545dc8ab278SRajkumar Manoharan return skb; 5546dc8ab278SRajkumar Manoharan } 5547dc8ab278SRajkumar Manoharan 554865c0893dSRajkumar Manoharan static struct sk_buff * 554965c0893dSRajkumar Manoharan ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 555065c0893dSRajkumar Manoharan u32 tid, u32 buf_size) 555165c0893dSRajkumar Manoharan { 555265c0893dSRajkumar Manoharan struct wmi_addba_send_cmd *cmd; 555365c0893dSRajkumar Manoharan struct sk_buff *skb; 555465c0893dSRajkumar Manoharan 555565c0893dSRajkumar Manoharan if (!mac) 555665c0893dSRajkumar Manoharan return ERR_PTR(-EINVAL); 555765c0893dSRajkumar Manoharan 555865c0893dSRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 555965c0893dSRajkumar Manoharan if (!skb) 556065c0893dSRajkumar Manoharan return ERR_PTR(-ENOMEM); 556165c0893dSRajkumar Manoharan 556265c0893dSRajkumar Manoharan cmd = (struct wmi_addba_send_cmd *)skb->data; 556365c0893dSRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 556465c0893dSRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 556565c0893dSRajkumar Manoharan cmd->tid = __cpu_to_le32(tid); 556665c0893dSRajkumar Manoharan cmd->buffersize = __cpu_to_le32(buf_size); 556765c0893dSRajkumar Manoharan 556865c0893dSRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 556965c0893dSRajkumar Manoharan "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n", 557065c0893dSRajkumar Manoharan vdev_id, mac, tid, buf_size); 557165c0893dSRajkumar Manoharan return skb; 557265c0893dSRajkumar Manoharan } 557365c0893dSRajkumar Manoharan 557411597413SRajkumar Manoharan static struct sk_buff * 557511597413SRajkumar Manoharan ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac, 557611597413SRajkumar Manoharan u32 tid, u32 status) 557711597413SRajkumar Manoharan { 557811597413SRajkumar Manoharan struct wmi_addba_setresponse_cmd *cmd; 557911597413SRajkumar Manoharan struct sk_buff *skb; 558011597413SRajkumar Manoharan 558111597413SRajkumar Manoharan if (!mac) 558211597413SRajkumar Manoharan return ERR_PTR(-EINVAL); 558311597413SRajkumar Manoharan 558411597413SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 558511597413SRajkumar Manoharan if (!skb) 558611597413SRajkumar Manoharan return ERR_PTR(-ENOMEM); 558711597413SRajkumar Manoharan 558811597413SRajkumar Manoharan cmd = (struct wmi_addba_setresponse_cmd *)skb->data; 558911597413SRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 559011597413SRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 559111597413SRajkumar Manoharan cmd->tid = __cpu_to_le32(tid); 559211597413SRajkumar Manoharan cmd->statuscode = __cpu_to_le32(status); 559311597413SRajkumar Manoharan 559411597413SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 559511597413SRajkumar Manoharan "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n", 559611597413SRajkumar Manoharan vdev_id, mac, tid, status); 559711597413SRajkumar Manoharan return skb; 559811597413SRajkumar Manoharan } 559911597413SRajkumar Manoharan 560050abef85SRajkumar Manoharan static struct sk_buff * 560150abef85SRajkumar Manoharan ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 560250abef85SRajkumar Manoharan u32 tid, u32 initiator, u32 reason) 560350abef85SRajkumar Manoharan { 560450abef85SRajkumar Manoharan struct wmi_delba_send_cmd *cmd; 560550abef85SRajkumar Manoharan struct sk_buff *skb; 560650abef85SRajkumar Manoharan 560750abef85SRajkumar Manoharan if (!mac) 560850abef85SRajkumar Manoharan return ERR_PTR(-EINVAL); 560950abef85SRajkumar Manoharan 561050abef85SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 561150abef85SRajkumar Manoharan if (!skb) 561250abef85SRajkumar Manoharan return ERR_PTR(-ENOMEM); 561350abef85SRajkumar Manoharan 561450abef85SRajkumar Manoharan cmd = (struct wmi_delba_send_cmd *)skb->data; 561550abef85SRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 561650abef85SRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 561750abef85SRajkumar Manoharan cmd->tid = __cpu_to_le32(tid); 561850abef85SRajkumar Manoharan cmd->initiator = __cpu_to_le32(initiator); 561950abef85SRajkumar Manoharan cmd->reasoncode = __cpu_to_le32(reason); 562050abef85SRajkumar Manoharan 562150abef85SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 562250abef85SRajkumar Manoharan "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n", 562350abef85SRajkumar Manoharan vdev_id, mac, tid, initiator, reason); 562450abef85SRajkumar Manoharan return skb; 562550abef85SRajkumar Manoharan } 562650abef85SRajkumar Manoharan 5627d7579d12SMichal Kazior static const struct wmi_ops wmi_ops = { 5628d7579d12SMichal Kazior .rx = ath10k_wmi_op_rx, 5629d7579d12SMichal Kazior .map_svc = wmi_main_svc_map, 5630d7579d12SMichal Kazior 5631d7579d12SMichal Kazior .pull_scan = ath10k_wmi_op_pull_scan_ev, 5632d7579d12SMichal Kazior .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 5633d7579d12SMichal Kazior .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 5634d7579d12SMichal Kazior .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 5635d7579d12SMichal Kazior .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 5636d7579d12SMichal Kazior .pull_swba = ath10k_wmi_op_pull_swba_ev, 5637d7579d12SMichal Kazior .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 5638d7579d12SMichal Kazior .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev, 5639d7579d12SMichal Kazior .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 5640d7579d12SMichal Kazior .pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats, 5641c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 5642d7579d12SMichal Kazior 5643d7579d12SMichal Kazior .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 5644d7579d12SMichal Kazior .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 5645d7579d12SMichal Kazior .gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd, 5646d7579d12SMichal Kazior .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 5647d7579d12SMichal Kazior .gen_init = ath10k_wmi_op_gen_init, 5648d7579d12SMichal Kazior .gen_start_scan = ath10k_wmi_op_gen_start_scan, 5649d7579d12SMichal Kazior .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 5650d7579d12SMichal Kazior .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 5651d7579d12SMichal Kazior .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 5652d7579d12SMichal Kazior .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 5653d7579d12SMichal Kazior .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 5654d7579d12SMichal Kazior .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 5655d7579d12SMichal Kazior .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 5656d7579d12SMichal Kazior .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 5657d7579d12SMichal Kazior .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 5658d7579d12SMichal Kazior .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 5659d7579d12SMichal Kazior .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 56606d492fe2SMichal Kazior /* .gen_vdev_wmm_conf not implemented */ 5661d7579d12SMichal Kazior .gen_peer_create = ath10k_wmi_op_gen_peer_create, 5662d7579d12SMichal Kazior .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 5663d7579d12SMichal Kazior .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 5664d7579d12SMichal Kazior .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 5665d7579d12SMichal Kazior .gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc, 5666d7579d12SMichal Kazior .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 5667d7579d12SMichal Kazior .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 5668d7579d12SMichal Kazior .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 5669d7579d12SMichal Kazior .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 5670d7579d12SMichal Kazior .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 5671d7579d12SMichal Kazior .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 5672d7579d12SMichal Kazior .gen_request_stats = ath10k_wmi_op_gen_request_stats, 5673d7579d12SMichal Kazior .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 5674d7579d12SMichal Kazior .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 5675d7579d12SMichal Kazior .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 5676d7579d12SMichal Kazior .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 5677d7579d12SMichal Kazior .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 5678ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 5679a57a6a27SRajkumar Manoharan /* .gen_pdev_get_temperature not implemented */ 5680dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 568165c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 568211597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 568350abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 5684be9ce9d8SMichal Kazior /* .gen_bcn_tmpl not implemented */ 56854c4955feSMichal Kazior /* .gen_prb_tmpl not implemented */ 5686369242b4SMichal Kazior /* .gen_p2p_go_bcn_ie not implemented */ 56875b272e30SMichal Kazior /* .gen_adaptive_qcs not implemented */ 5688d7579d12SMichal Kazior }; 5689d7579d12SMichal Kazior 5690d7579d12SMichal Kazior static const struct wmi_ops wmi_10_1_ops = { 5691d7579d12SMichal Kazior .rx = ath10k_wmi_10_1_op_rx, 5692d7579d12SMichal Kazior .map_svc = wmi_10x_svc_map, 5693d7579d12SMichal Kazior .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 5694d7579d12SMichal Kazior .pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats, 5695d7579d12SMichal Kazior .gen_init = ath10k_wmi_10_1_op_gen_init, 5696d7579d12SMichal Kazior .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 5697d7579d12SMichal Kazior .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 5698d7579d12SMichal Kazior .gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc, 5699a57a6a27SRajkumar Manoharan /* .gen_pdev_get_temperature not implemented */ 5700d7579d12SMichal Kazior 5701d7579d12SMichal Kazior /* shared with main branch */ 5702d7579d12SMichal Kazior .pull_scan = ath10k_wmi_op_pull_scan_ev, 5703d7579d12SMichal Kazior .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 5704d7579d12SMichal Kazior .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 5705d7579d12SMichal Kazior .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 5706d7579d12SMichal Kazior .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 5707d7579d12SMichal Kazior .pull_swba = ath10k_wmi_op_pull_swba_ev, 5708d7579d12SMichal Kazior .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 5709d7579d12SMichal Kazior .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 5710c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 5711d7579d12SMichal Kazior 5712d7579d12SMichal Kazior .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 5713d7579d12SMichal Kazior .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 5714d7579d12SMichal Kazior .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 5715d7579d12SMichal Kazior .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 5716d7579d12SMichal Kazior .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 5717d7579d12SMichal Kazior .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 5718d7579d12SMichal Kazior .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 5719d7579d12SMichal Kazior .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 5720d7579d12SMichal Kazior .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 5721d7579d12SMichal Kazior .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 5722d7579d12SMichal Kazior .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 5723d7579d12SMichal Kazior .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 5724d7579d12SMichal Kazior .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 5725d7579d12SMichal Kazior .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 57266d492fe2SMichal Kazior /* .gen_vdev_wmm_conf not implemented */ 5727d7579d12SMichal Kazior .gen_peer_create = ath10k_wmi_op_gen_peer_create, 5728d7579d12SMichal Kazior .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 5729d7579d12SMichal Kazior .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 5730d7579d12SMichal Kazior .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 5731d7579d12SMichal Kazior .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 5732d7579d12SMichal Kazior .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 5733d7579d12SMichal Kazior .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 5734d7579d12SMichal Kazior .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 5735d7579d12SMichal Kazior .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 5736d7579d12SMichal Kazior .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 5737d7579d12SMichal Kazior .gen_request_stats = ath10k_wmi_op_gen_request_stats, 5738d7579d12SMichal Kazior .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 5739d7579d12SMichal Kazior .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 5740d7579d12SMichal Kazior .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 5741d7579d12SMichal Kazior .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 5742d7579d12SMichal Kazior .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 5743ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 5744dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 574565c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 574611597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 574750abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 5748be9ce9d8SMichal Kazior /* .gen_bcn_tmpl not implemented */ 57494c4955feSMichal Kazior /* .gen_prb_tmpl not implemented */ 5750369242b4SMichal Kazior /* .gen_p2p_go_bcn_ie not implemented */ 57515b272e30SMichal Kazior /* .gen_adaptive_qcs not implemented */ 5752d7579d12SMichal Kazior }; 5753d7579d12SMichal Kazior 5754d7579d12SMichal Kazior static const struct wmi_ops wmi_10_2_ops = { 5755d7579d12SMichal Kazior .rx = ath10k_wmi_10_2_op_rx, 575620de2229SMichal Kazior .pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats, 5757d7579d12SMichal Kazior .gen_init = ath10k_wmi_10_2_op_gen_init, 5758d7579d12SMichal Kazior .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc, 5759a57a6a27SRajkumar Manoharan /* .gen_pdev_get_temperature not implemented */ 5760d7579d12SMichal Kazior 5761d7579d12SMichal Kazior /* shared with 10.1 */ 5762d7579d12SMichal Kazior .map_svc = wmi_10x_svc_map, 5763d7579d12SMichal Kazior .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 5764d7579d12SMichal Kazior .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 5765d7579d12SMichal Kazior .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 5766d7579d12SMichal Kazior 5767d7579d12SMichal Kazior .pull_scan = ath10k_wmi_op_pull_scan_ev, 5768d7579d12SMichal Kazior .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 5769d7579d12SMichal Kazior .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 5770d7579d12SMichal Kazior .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 5771d7579d12SMichal Kazior .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 5772d7579d12SMichal Kazior .pull_swba = ath10k_wmi_op_pull_swba_ev, 5773d7579d12SMichal Kazior .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 5774d7579d12SMichal Kazior .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 5775c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 5776d7579d12SMichal Kazior 5777d7579d12SMichal Kazior .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 5778d7579d12SMichal Kazior .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 5779d7579d12SMichal Kazior .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 5780d7579d12SMichal Kazior .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 5781d7579d12SMichal Kazior .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 5782d7579d12SMichal Kazior .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 5783d7579d12SMichal Kazior .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 5784d7579d12SMichal Kazior .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 5785d7579d12SMichal Kazior .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 5786d7579d12SMichal Kazior .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 5787d7579d12SMichal Kazior .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 5788d7579d12SMichal Kazior .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 5789d7579d12SMichal Kazior .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 5790d7579d12SMichal Kazior .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 57916d492fe2SMichal Kazior /* .gen_vdev_wmm_conf not implemented */ 5792d7579d12SMichal Kazior .gen_peer_create = ath10k_wmi_op_gen_peer_create, 5793d7579d12SMichal Kazior .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 5794d7579d12SMichal Kazior .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 5795d7579d12SMichal Kazior .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 5796d7579d12SMichal Kazior .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 5797d7579d12SMichal Kazior .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 5798d7579d12SMichal Kazior .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 5799d7579d12SMichal Kazior .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 5800d7579d12SMichal Kazior .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 5801d7579d12SMichal Kazior .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 5802d7579d12SMichal Kazior .gen_request_stats = ath10k_wmi_op_gen_request_stats, 5803d7579d12SMichal Kazior .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 5804d7579d12SMichal Kazior .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 5805d7579d12SMichal Kazior .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 5806d7579d12SMichal Kazior .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 5807d7579d12SMichal Kazior .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 5808ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 5809dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 581065c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 581111597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 581250abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 5813d7579d12SMichal Kazior }; 5814d7579d12SMichal Kazior 58154a16fbecSRajkumar Manoharan static const struct wmi_ops wmi_10_2_4_ops = { 58164a16fbecSRajkumar Manoharan .rx = ath10k_wmi_10_2_op_rx, 581720de2229SMichal Kazior .pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats, 58184a16fbecSRajkumar Manoharan .gen_init = ath10k_wmi_10_2_op_gen_init, 58194a16fbecSRajkumar Manoharan .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc, 5820a57a6a27SRajkumar Manoharan .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature, 58214a16fbecSRajkumar Manoharan 58224a16fbecSRajkumar Manoharan /* shared with 10.1 */ 58234a16fbecSRajkumar Manoharan .map_svc = wmi_10x_svc_map, 58244a16fbecSRajkumar Manoharan .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 58254a16fbecSRajkumar Manoharan .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 58264a16fbecSRajkumar Manoharan .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 58274a16fbecSRajkumar Manoharan 58284a16fbecSRajkumar Manoharan .pull_scan = ath10k_wmi_op_pull_scan_ev, 58294a16fbecSRajkumar Manoharan .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 58304a16fbecSRajkumar Manoharan .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 58314a16fbecSRajkumar Manoharan .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 58324a16fbecSRajkumar Manoharan .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 58334a16fbecSRajkumar Manoharan .pull_swba = ath10k_wmi_op_pull_swba_ev, 58344a16fbecSRajkumar Manoharan .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 58354a16fbecSRajkumar Manoharan .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 5836c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 58374a16fbecSRajkumar Manoharan 58384a16fbecSRajkumar Manoharan .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 58394a16fbecSRajkumar Manoharan .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 58404a16fbecSRajkumar Manoharan .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 58414a16fbecSRajkumar Manoharan .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 58424a16fbecSRajkumar Manoharan .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 58434a16fbecSRajkumar Manoharan .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 58444a16fbecSRajkumar Manoharan .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 58454a16fbecSRajkumar Manoharan .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 58464a16fbecSRajkumar Manoharan .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 58474a16fbecSRajkumar Manoharan .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 58484a16fbecSRajkumar Manoharan .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 58494a16fbecSRajkumar Manoharan .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 58504a16fbecSRajkumar Manoharan .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 58514a16fbecSRajkumar Manoharan .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 58524a16fbecSRajkumar Manoharan .gen_peer_create = ath10k_wmi_op_gen_peer_create, 58534a16fbecSRajkumar Manoharan .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 58544a16fbecSRajkumar Manoharan .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 58554a16fbecSRajkumar Manoharan .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 58564a16fbecSRajkumar Manoharan .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 58574a16fbecSRajkumar Manoharan .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 58584a16fbecSRajkumar Manoharan .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 58594a16fbecSRajkumar Manoharan .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 58604a16fbecSRajkumar Manoharan .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 58614a16fbecSRajkumar Manoharan .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 58624a16fbecSRajkumar Manoharan .gen_request_stats = ath10k_wmi_op_gen_request_stats, 58634a16fbecSRajkumar Manoharan .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 58644a16fbecSRajkumar Manoharan .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 58654a16fbecSRajkumar Manoharan .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 58664a16fbecSRajkumar Manoharan .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 58674a16fbecSRajkumar Manoharan .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 5868ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 5869dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 587065c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 587111597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 587250abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 5873be9ce9d8SMichal Kazior /* .gen_bcn_tmpl not implemented */ 58744c4955feSMichal Kazior /* .gen_prb_tmpl not implemented */ 5875369242b4SMichal Kazior /* .gen_p2p_go_bcn_ie not implemented */ 58765b272e30SMichal Kazior /* .gen_adaptive_qcs not implemented */ 58774a16fbecSRajkumar Manoharan }; 58784a16fbecSRajkumar Manoharan 5879840357ccSRaja Mani static const struct wmi_ops wmi_10_4_ops = { 5880840357ccSRaja Mani .map_svc = wmi_10_4_svc_map, 5881840357ccSRaja Mani }; 5882840357ccSRaja Mani 5883b79b9baaSMichal Kazior int ath10k_wmi_attach(struct ath10k *ar) 5884b79b9baaSMichal Kazior { 5885d7579d12SMichal Kazior switch (ar->wmi.op_version) { 58869bd21322SRaja Mani case ATH10K_FW_WMI_OP_VERSION_10_4: 5887840357ccSRaja Mani ar->wmi.ops = &wmi_10_4_ops; 58882d491e69SRaja Mani ar->wmi.cmd = &wmi_10_4_cmd_map; 588993841a15SRaja Mani ar->wmi.vdev_param = &wmi_10_4_vdev_param_map; 58909bd21322SRaja Mani break; 58914a16fbecSRajkumar Manoharan case ATH10K_FW_WMI_OP_VERSION_10_2_4: 58924a16fbecSRajkumar Manoharan ar->wmi.cmd = &wmi_10_2_4_cmd_map; 58934a16fbecSRajkumar Manoharan ar->wmi.ops = &wmi_10_2_4_ops; 58944a16fbecSRajkumar Manoharan ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map; 58954a16fbecSRajkumar Manoharan ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map; 58964a16fbecSRajkumar Manoharan break; 5897d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_10_2: 5898b79b9baaSMichal Kazior ar->wmi.cmd = &wmi_10_2_cmd_map; 5899d7579d12SMichal Kazior ar->wmi.ops = &wmi_10_2_ops; 5900b79b9baaSMichal Kazior ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 5901b79b9baaSMichal Kazior ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 5902d7579d12SMichal Kazior break; 5903d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_10_1: 5904d7579d12SMichal Kazior ar->wmi.cmd = &wmi_10x_cmd_map; 5905d7579d12SMichal Kazior ar->wmi.ops = &wmi_10_1_ops; 5906d7579d12SMichal Kazior ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 5907d7579d12SMichal Kazior ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 5908d7579d12SMichal Kazior break; 5909d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_MAIN: 5910b79b9baaSMichal Kazior ar->wmi.cmd = &wmi_cmd_map; 5911d7579d12SMichal Kazior ar->wmi.ops = &wmi_ops; 5912b79b9baaSMichal Kazior ar->wmi.vdev_param = &wmi_vdev_param_map; 5913b79b9baaSMichal Kazior ar->wmi.pdev_param = &wmi_pdev_param_map; 5914d7579d12SMichal Kazior break; 5915ca996ec5SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_TLV: 5916ca996ec5SMichal Kazior ath10k_wmi_tlv_attach(ar); 5917ca996ec5SMichal Kazior break; 5918d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_UNSET: 5919d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_MAX: 5920d7579d12SMichal Kazior ath10k_err(ar, "unsupported WMI op version: %d\n", 5921d7579d12SMichal Kazior ar->wmi.op_version); 5922d7579d12SMichal Kazior return -EINVAL; 5923b79b9baaSMichal Kazior } 5924b79b9baaSMichal Kazior 5925b79b9baaSMichal Kazior init_completion(&ar->wmi.service_ready); 5926b79b9baaSMichal Kazior init_completion(&ar->wmi.unified_ready); 5927b79b9baaSMichal Kazior 5928b79b9baaSMichal Kazior return 0; 5929b79b9baaSMichal Kazior } 5930b79b9baaSMichal Kazior 5931b79b9baaSMichal Kazior void ath10k_wmi_detach(struct ath10k *ar) 5932b79b9baaSMichal Kazior { 5933b79b9baaSMichal Kazior int i; 5934b79b9baaSMichal Kazior 5935b79b9baaSMichal Kazior /* free the host memory chunks requested by firmware */ 5936b79b9baaSMichal Kazior for (i = 0; i < ar->wmi.num_mem_chunks; i++) { 5937b79b9baaSMichal Kazior dma_free_coherent(ar->dev, 5938b79b9baaSMichal Kazior ar->wmi.mem_chunks[i].len, 5939b79b9baaSMichal Kazior ar->wmi.mem_chunks[i].vaddr, 5940b79b9baaSMichal Kazior ar->wmi.mem_chunks[i].paddr); 5941b79b9baaSMichal Kazior } 5942b79b9baaSMichal Kazior 5943b79b9baaSMichal Kazior ar->wmi.num_mem_chunks = 0; 5944b79b9baaSMichal Kazior } 5945