1f0553ca9SKalle Valo // SPDX-License-Identifier: ISC 25e3dd157SKalle Valo /* 35e3dd157SKalle Valo * Copyright (c) 2005-2011 Atheros Communications Inc. 48b1083d6SKalle Valo * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. 56e8a8991SRakesh Pillai * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. 65e3dd157SKalle Valo */ 75e3dd157SKalle Valo 85e3dd157SKalle Valo #include <linux/skbuff.h> 92fe5288cSKalle Valo #include <linux/ctype.h> 105e3dd157SKalle Valo 115e3dd157SKalle Valo #include "core.h" 125e3dd157SKalle Valo #include "htc.h" 135e3dd157SKalle Valo #include "debug.h" 145e3dd157SKalle Valo #include "wmi.h" 15ca996ec5SMichal Kazior #include "wmi-tlv.h" 165e3dd157SKalle Valo #include "mac.h" 1743d2a30fSKalle Valo #include "testmode.h" 18d7579d12SMichal Kazior #include "wmi-ops.h" 196a94888fSMichal Kazior #include "p2p.h" 20587f7031SMichal Kazior #include "hw.h" 21bc1efd73SSebastian Gottschall #include "hif.h" 228ed05ed0SManikanta Pubbisetty #include "txrx.h" 235e3dd157SKalle Valo 2420ddca21SMichal Kazior #define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9 2520ddca21SMichal Kazior #define ATH10K_WMI_BARRIER_TIMEOUT_HZ (3 * HZ) 266f6eb1bcSSriram R #define ATH10K_WMI_DFS_CONF_TIMEOUT_HZ (HZ / 6) 2720ddca21SMichal Kazior 28ce42870eSBartosz Markowski /* MAIN WMI cmd track */ 29ce42870eSBartosz Markowski static struct wmi_cmd_map wmi_cmd_map = { 30ce42870eSBartosz Markowski .init_cmdid = WMI_INIT_CMDID, 31ce42870eSBartosz Markowski .start_scan_cmdid = WMI_START_SCAN_CMDID, 32ce42870eSBartosz Markowski .stop_scan_cmdid = WMI_STOP_SCAN_CMDID, 33ce42870eSBartosz Markowski .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID, 34ce42870eSBartosz Markowski .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID, 3560e1d0fbSCarl Huang .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 36ce42870eSBartosz Markowski .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID, 37ce42870eSBartosz Markowski .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID, 38ce42870eSBartosz Markowski .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID, 39ce42870eSBartosz Markowski .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID, 40ce42870eSBartosz Markowski .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID, 41ce42870eSBartosz Markowski .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID, 42ce42870eSBartosz Markowski .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID, 43ce42870eSBartosz Markowski .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID, 44ce42870eSBartosz Markowski .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID, 45ce42870eSBartosz Markowski .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID, 46ce42870eSBartosz Markowski .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID, 47ce42870eSBartosz Markowski .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID, 48ce42870eSBartosz Markowski .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID, 49ce42870eSBartosz Markowski .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID, 50ce42870eSBartosz Markowski .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID, 51ce42870eSBartosz Markowski .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID, 52ce42870eSBartosz Markowski .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID, 53ce42870eSBartosz Markowski .vdev_up_cmdid = WMI_VDEV_UP_CMDID, 54ce42870eSBartosz Markowski .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID, 55ce42870eSBartosz Markowski .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID, 56ce42870eSBartosz Markowski .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID, 57ce42870eSBartosz Markowski .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID, 58ce42870eSBartosz Markowski .peer_create_cmdid = WMI_PEER_CREATE_CMDID, 59ce42870eSBartosz Markowski .peer_delete_cmdid = WMI_PEER_DELETE_CMDID, 60ce42870eSBartosz Markowski .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID, 61ce42870eSBartosz Markowski .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID, 62ce42870eSBartosz Markowski .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID, 63ce42870eSBartosz Markowski .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID, 64ce42870eSBartosz Markowski .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID, 65ce42870eSBartosz Markowski .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID, 66ce42870eSBartosz Markowski .bcn_tx_cmdid = WMI_BCN_TX_CMDID, 67ce42870eSBartosz Markowski .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID, 68ce42870eSBartosz Markowski .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID, 69ce42870eSBartosz Markowski .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID, 70ce42870eSBartosz Markowski .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID, 71ce42870eSBartosz Markowski .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID, 72ce42870eSBartosz Markowski .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID, 73ce42870eSBartosz Markowski .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID, 74ce42870eSBartosz Markowski .addba_send_cmdid = WMI_ADDBA_SEND_CMDID, 75ce42870eSBartosz Markowski .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID, 76ce42870eSBartosz Markowski .delba_send_cmdid = WMI_DELBA_SEND_CMDID, 77ce42870eSBartosz Markowski .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID, 78ce42870eSBartosz Markowski .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID, 79ce42870eSBartosz Markowski .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID, 80ce42870eSBartosz Markowski .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID, 81ce42870eSBartosz Markowski .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID, 82ce42870eSBartosz Markowski .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID, 83ce42870eSBartosz Markowski .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID, 84ce42870eSBartosz Markowski .roam_scan_mode = WMI_ROAM_SCAN_MODE, 85ce42870eSBartosz Markowski .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD, 86ce42870eSBartosz Markowski .roam_scan_period = WMI_ROAM_SCAN_PERIOD, 87ce42870eSBartosz Markowski .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 88ce42870eSBartosz Markowski .roam_ap_profile = WMI_ROAM_AP_PROFILE, 89ce42870eSBartosz Markowski .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE, 90ce42870eSBartosz Markowski .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE, 91ce42870eSBartosz Markowski .ofl_scan_period = WMI_OFL_SCAN_PERIOD, 92ce42870eSBartosz Markowski .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO, 93ce42870eSBartosz Markowski .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY, 94ce42870eSBartosz Markowski .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE, 95ce42870eSBartosz Markowski .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE, 96ce42870eSBartosz Markowski .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID, 97ce42870eSBartosz Markowski .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID, 98ce42870eSBartosz Markowski .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID, 99ce42870eSBartosz Markowski .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID, 100ce42870eSBartosz Markowski .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID, 101ce42870eSBartosz Markowski .wlan_profile_set_hist_intvl_cmdid = 102ce42870eSBartosz Markowski WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 103ce42870eSBartosz Markowski .wlan_profile_get_profile_data_cmdid = 104ce42870eSBartosz Markowski WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 105ce42870eSBartosz Markowski .wlan_profile_enable_profile_id_cmdid = 106ce42870eSBartosz Markowski WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 107ce42870eSBartosz Markowski .wlan_profile_list_profile_id_cmdid = 108ce42870eSBartosz Markowski WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 109ce42870eSBartosz Markowski .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID, 110ce42870eSBartosz Markowski .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID, 111ce42870eSBartosz Markowski .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID, 112ce42870eSBartosz Markowski .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID, 113ce42870eSBartosz Markowski .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID, 114ce42870eSBartosz Markowski .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID, 115ce42870eSBartosz Markowski .wow_enable_disable_wake_event_cmdid = 116ce42870eSBartosz Markowski WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 117ce42870eSBartosz Markowski .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID, 118ce42870eSBartosz Markowski .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 119ce42870eSBartosz Markowski .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID, 120ce42870eSBartosz Markowski .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID, 121ce42870eSBartosz Markowski .vdev_spectral_scan_configure_cmdid = 122ce42870eSBartosz Markowski WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 123ce42870eSBartosz Markowski .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 124ce42870eSBartosz Markowski .request_stats_cmdid = WMI_REQUEST_STATS_CMDID, 125ce42870eSBartosz Markowski .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID, 126ce42870eSBartosz Markowski .network_list_offload_config_cmdid = 127ce42870eSBartosz Markowski WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID, 128ce42870eSBartosz Markowski .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID, 129ce42870eSBartosz Markowski .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID, 130ce42870eSBartosz Markowski .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID, 131ce42870eSBartosz Markowski .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID, 132ce42870eSBartosz Markowski .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID, 133ce42870eSBartosz Markowski .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID, 134ce42870eSBartosz Markowski .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID, 135ce42870eSBartosz Markowski .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID, 136ce42870eSBartosz Markowski .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD, 137ce42870eSBartosz Markowski .echo_cmdid = WMI_ECHO_CMDID, 138ce42870eSBartosz Markowski .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID, 139ce42870eSBartosz Markowski .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID, 140ce42870eSBartosz Markowski .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID, 141ce42870eSBartosz Markowski .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID, 142ce42870eSBartosz Markowski .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID, 143ce42870eSBartosz Markowski .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID, 144ce42870eSBartosz Markowski .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID, 145ce42870eSBartosz Markowski .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID, 146ce42870eSBartosz Markowski .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID, 147a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 14862f77f09SMaharaja .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, 149772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 150772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 151772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 152772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 153772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 154772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 155772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 156772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 157772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 158772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 159772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 160772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 161772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 162772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 163772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 164772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 165772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 166772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 167772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 168772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 169772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 170772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 171772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 172772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 173772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 174772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 175772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 176772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 177772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 178772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 179772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 180772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 181772b4aeeSRaja Mani .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 182772b4aeeSRaja Mani .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 183772b4aeeSRaja Mani .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 184772b4aeeSRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 185772b4aeeSRaja Mani .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 186772b4aeeSRaja Mani .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 187772b4aeeSRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 188772b4aeeSRaja Mani .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 189772b4aeeSRaja Mani .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 190772b4aeeSRaja Mani .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED, 191bc64d052SMaharaja Kennadyrajan .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 1926f6eb1bcSSriram R .radar_found_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, 20260e1d0fbSCarl Huang .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 203b7e3adf9SBartosz Markowski .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID, 204b7e3adf9SBartosz Markowski .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID, 205b7e3adf9SBartosz Markowski .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID, 206b7e3adf9SBartosz Markowski .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID, 207b7e3adf9SBartosz Markowski .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID, 208b7e3adf9SBartosz Markowski .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID, 209b7e3adf9SBartosz Markowski .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID, 210b7e3adf9SBartosz Markowski .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID, 211b7e3adf9SBartosz Markowski .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID, 212b7e3adf9SBartosz Markowski .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID, 213b7e3adf9SBartosz Markowski .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID, 214b7e3adf9SBartosz Markowski .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID, 215b7e3adf9SBartosz Markowski .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID, 216b7e3adf9SBartosz Markowski .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID, 217b7e3adf9SBartosz Markowski .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID, 218b7e3adf9SBartosz Markowski .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID, 219b7e3adf9SBartosz Markowski .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID, 220b7e3adf9SBartosz Markowski .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID, 221b7e3adf9SBartosz Markowski .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID, 222b7e3adf9SBartosz Markowski .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID, 223b7e3adf9SBartosz Markowski .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID, 224b7e3adf9SBartosz Markowski .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID, 225b7e3adf9SBartosz Markowski .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID, 226b7e3adf9SBartosz Markowski .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID, 227b7e3adf9SBartosz Markowski .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID, 228b7e3adf9SBartosz Markowski .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID, 229b7e3adf9SBartosz Markowski .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID, 230b7e3adf9SBartosz Markowski .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID, 231b7e3adf9SBartosz Markowski .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID, 232b7e3adf9SBartosz Markowski .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID, 233b7e3adf9SBartosz Markowski .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID, 234b7e3adf9SBartosz Markowski .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID, 23534957b25SBartosz Markowski .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 236b7e3adf9SBartosz Markowski .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID, 237b7e3adf9SBartosz Markowski .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID, 238b7e3adf9SBartosz Markowski .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID, 23934957b25SBartosz Markowski .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 240b7e3adf9SBartosz Markowski .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID, 241b7e3adf9SBartosz Markowski .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID, 242b7e3adf9SBartosz Markowski .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID, 243b7e3adf9SBartosz Markowski .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID, 244b7e3adf9SBartosz Markowski .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID, 245b7e3adf9SBartosz Markowski .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID, 246b7e3adf9SBartosz Markowski .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID, 247b7e3adf9SBartosz Markowski .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID, 248b7e3adf9SBartosz Markowski .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID, 249b7e3adf9SBartosz Markowski .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID, 250b7e3adf9SBartosz Markowski .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID, 251b7e3adf9SBartosz Markowski .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE, 252b7e3adf9SBartosz Markowski .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD, 253b7e3adf9SBartosz Markowski .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD, 254b7e3adf9SBartosz Markowski .roam_scan_rssi_change_threshold = 255b7e3adf9SBartosz Markowski WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 256b7e3adf9SBartosz Markowski .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE, 257b7e3adf9SBartosz Markowski .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE, 258b7e3adf9SBartosz Markowski .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE, 259b7e3adf9SBartosz Markowski .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD, 260b7e3adf9SBartosz Markowski .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO, 261b7e3adf9SBartosz Markowski .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY, 262b7e3adf9SBartosz Markowski .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE, 263b7e3adf9SBartosz Markowski .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE, 26434957b25SBartosz Markowski .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 265542fb174SJanusz Dziedzic .ap_ps_peer_param_cmdid = WMI_10X_AP_PS_PEER_PARAM_CMDID, 26634957b25SBartosz Markowski .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 267b7e3adf9SBartosz Markowski .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID, 268b7e3adf9SBartosz Markowski .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID, 269b7e3adf9SBartosz Markowski .wlan_profile_set_hist_intvl_cmdid = 270b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 271b7e3adf9SBartosz Markowski .wlan_profile_get_profile_data_cmdid = 272b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 273b7e3adf9SBartosz Markowski .wlan_profile_enable_profile_id_cmdid = 274b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 275b7e3adf9SBartosz Markowski .wlan_profile_list_profile_id_cmdid = 276b7e3adf9SBartosz Markowski WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 277b7e3adf9SBartosz Markowski .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID, 278b7e3adf9SBartosz Markowski .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID, 279b7e3adf9SBartosz Markowski .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID, 280b7e3adf9SBartosz Markowski .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID, 281b7e3adf9SBartosz Markowski .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID, 282b7e3adf9SBartosz Markowski .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID, 283b7e3adf9SBartosz Markowski .wow_enable_disable_wake_event_cmdid = 284b7e3adf9SBartosz Markowski WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 285b7e3adf9SBartosz Markowski .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID, 286b7e3adf9SBartosz Markowski .wow_hostwakeup_from_sleep_cmdid = 287b7e3adf9SBartosz Markowski WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 288b7e3adf9SBartosz Markowski .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID, 289b7e3adf9SBartosz Markowski .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID, 290b7e3adf9SBartosz Markowski .vdev_spectral_scan_configure_cmdid = 291b7e3adf9SBartosz Markowski WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 292b7e3adf9SBartosz Markowski .vdev_spectral_scan_enable_cmdid = 293b7e3adf9SBartosz Markowski WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 294b7e3adf9SBartosz Markowski .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID, 29534957b25SBartosz Markowski .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 29634957b25SBartosz Markowski .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 29734957b25SBartosz Markowski .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 29834957b25SBartosz Markowski .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 29934957b25SBartosz Markowski .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 30034957b25SBartosz Markowski .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 30134957b25SBartosz Markowski .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 30234957b25SBartosz Markowski .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 30334957b25SBartosz Markowski .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 30434957b25SBartosz Markowski .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 30534957b25SBartosz Markowski .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 306b7e3adf9SBartosz Markowski .echo_cmdid = WMI_10X_ECHO_CMDID, 307b7e3adf9SBartosz Markowski .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID, 308b7e3adf9SBartosz Markowski .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID, 309b7e3adf9SBartosz Markowski .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID, 31034957b25SBartosz Markowski .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 31134957b25SBartosz Markowski .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 31234957b25SBartosz Markowski .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 31334957b25SBartosz Markowski .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 314b7e3adf9SBartosz Markowski .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID, 315b7e3adf9SBartosz Markowski .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID, 316a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 31762f77f09SMaharaja .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, 318772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 319772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 320772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 321772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 322772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 323772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 324772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 325772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 326772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 327772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 328772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 329772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 330772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 331772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 332772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 333772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 334772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 335772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 336772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 337772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 338772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 339772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 340772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 341772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 342772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 343772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 344772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 345772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 346772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 347772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 348772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 349772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 350772b4aeeSRaja Mani .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 351772b4aeeSRaja Mani .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 352772b4aeeSRaja Mani .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 353772b4aeeSRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 354772b4aeeSRaja Mani .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 355772b4aeeSRaja Mani .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 356772b4aeeSRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 357772b4aeeSRaja Mani .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 358772b4aeeSRaja Mani .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 359772b4aeeSRaja Mani .pdev_bss_chan_info_request_cmdid = WMI_CMD_UNSUPPORTED, 360bc64d052SMaharaja Kennadyrajan .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 3616f6eb1bcSSriram R .radar_found_cmdid = WMI_CMD_UNSUPPORTED, 362b7e3adf9SBartosz Markowski }; 363ce42870eSBartosz Markowski 3644a16fbecSRajkumar Manoharan /* 10.2.4 WMI cmd track */ 3654a16fbecSRajkumar Manoharan static struct wmi_cmd_map wmi_10_2_4_cmd_map = { 3664a16fbecSRajkumar Manoharan .init_cmdid = WMI_10_2_INIT_CMDID, 3674a16fbecSRajkumar Manoharan .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID, 3684a16fbecSRajkumar Manoharan .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID, 3694a16fbecSRajkumar Manoharan .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID, 3704a16fbecSRajkumar Manoharan .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 37160e1d0fbSCarl Huang .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 3724a16fbecSRajkumar Manoharan .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID, 3734a16fbecSRajkumar Manoharan .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID, 3744a16fbecSRajkumar Manoharan .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID, 3754a16fbecSRajkumar Manoharan .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID, 3764a16fbecSRajkumar Manoharan .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID, 3774a16fbecSRajkumar Manoharan .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID, 3784a16fbecSRajkumar Manoharan .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID, 3794a16fbecSRajkumar Manoharan .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID, 3804a16fbecSRajkumar Manoharan .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID, 3814a16fbecSRajkumar Manoharan .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID, 3824a16fbecSRajkumar Manoharan .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID, 3834a16fbecSRajkumar Manoharan .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID, 3844a16fbecSRajkumar Manoharan .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID, 3854a16fbecSRajkumar Manoharan .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID, 3864a16fbecSRajkumar Manoharan .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID, 3874a16fbecSRajkumar Manoharan .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID, 3884a16fbecSRajkumar Manoharan .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID, 3894a16fbecSRajkumar Manoharan .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID, 3904a16fbecSRajkumar Manoharan .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID, 3914a16fbecSRajkumar Manoharan .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID, 3924a16fbecSRajkumar Manoharan .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID, 3934a16fbecSRajkumar Manoharan .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID, 3944a16fbecSRajkumar Manoharan .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID, 3954a16fbecSRajkumar Manoharan .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID, 3964a16fbecSRajkumar Manoharan .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID, 3974a16fbecSRajkumar Manoharan .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID, 3984a16fbecSRajkumar Manoharan .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID, 3994a16fbecSRajkumar Manoharan .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID, 4004a16fbecSRajkumar Manoharan .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID, 4014a16fbecSRajkumar Manoharan .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID, 4024a16fbecSRajkumar Manoharan .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID, 4034a16fbecSRajkumar Manoharan .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 4044a16fbecSRajkumar Manoharan .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID, 4054a16fbecSRajkumar Manoharan .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID, 4064a16fbecSRajkumar Manoharan .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID, 4074a16fbecSRajkumar Manoharan .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 4084a16fbecSRajkumar Manoharan .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID, 4094a16fbecSRajkumar Manoharan .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID, 4104a16fbecSRajkumar Manoharan .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID, 4114a16fbecSRajkumar Manoharan .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID, 4124a16fbecSRajkumar Manoharan .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID, 4134a16fbecSRajkumar Manoharan .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID, 4144a16fbecSRajkumar Manoharan .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID, 4154a16fbecSRajkumar Manoharan .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID, 4164a16fbecSRajkumar Manoharan .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID, 4174a16fbecSRajkumar Manoharan .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID, 4184a16fbecSRajkumar Manoharan .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID, 4194a16fbecSRajkumar Manoharan .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE, 4204a16fbecSRajkumar Manoharan .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD, 4214a16fbecSRajkumar Manoharan .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD, 4224a16fbecSRajkumar Manoharan .roam_scan_rssi_change_threshold = 4234a16fbecSRajkumar Manoharan WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 4244a16fbecSRajkumar Manoharan .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE, 4254a16fbecSRajkumar Manoharan .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE, 4264a16fbecSRajkumar Manoharan .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE, 4274a16fbecSRajkumar Manoharan .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD, 4284a16fbecSRajkumar Manoharan .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO, 4294a16fbecSRajkumar Manoharan .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY, 4304a16fbecSRajkumar Manoharan .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE, 4314a16fbecSRajkumar Manoharan .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE, 4324a16fbecSRajkumar Manoharan .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 4334a16fbecSRajkumar Manoharan .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID, 4344a16fbecSRajkumar Manoharan .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 4354a16fbecSRajkumar Manoharan .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID, 4364a16fbecSRajkumar Manoharan .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID, 4374a16fbecSRajkumar Manoharan .wlan_profile_set_hist_intvl_cmdid = 4384a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 4394a16fbecSRajkumar Manoharan .wlan_profile_get_profile_data_cmdid = 4404a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 4414a16fbecSRajkumar Manoharan .wlan_profile_enable_profile_id_cmdid = 4424a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 4434a16fbecSRajkumar Manoharan .wlan_profile_list_profile_id_cmdid = 4444a16fbecSRajkumar Manoharan WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 4454a16fbecSRajkumar Manoharan .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID, 4464a16fbecSRajkumar Manoharan .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID, 4474a16fbecSRajkumar Manoharan .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID, 4484a16fbecSRajkumar Manoharan .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID, 4494a16fbecSRajkumar Manoharan .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID, 4504a16fbecSRajkumar Manoharan .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID, 4514a16fbecSRajkumar Manoharan .wow_enable_disable_wake_event_cmdid = 4524a16fbecSRajkumar Manoharan WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 4534a16fbecSRajkumar Manoharan .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID, 4544a16fbecSRajkumar Manoharan .wow_hostwakeup_from_sleep_cmdid = 4554a16fbecSRajkumar Manoharan WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 4564a16fbecSRajkumar Manoharan .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID, 4574a16fbecSRajkumar Manoharan .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID, 4584a16fbecSRajkumar Manoharan .vdev_spectral_scan_configure_cmdid = 4594a16fbecSRajkumar Manoharan WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 4604a16fbecSRajkumar Manoharan .vdev_spectral_scan_enable_cmdid = 4614a16fbecSRajkumar Manoharan WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 4624a16fbecSRajkumar Manoharan .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID, 4634a16fbecSRajkumar Manoharan .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 4644a16fbecSRajkumar Manoharan .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 4654a16fbecSRajkumar Manoharan .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 4664a16fbecSRajkumar Manoharan .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 4674a16fbecSRajkumar Manoharan .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 4684a16fbecSRajkumar Manoharan .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 4694a16fbecSRajkumar Manoharan .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 4704a16fbecSRajkumar Manoharan .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 4714a16fbecSRajkumar Manoharan .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 4724a16fbecSRajkumar Manoharan .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 4734a16fbecSRajkumar Manoharan .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 4744a16fbecSRajkumar Manoharan .echo_cmdid = WMI_10_2_ECHO_CMDID, 4754a16fbecSRajkumar Manoharan .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID, 4764a16fbecSRajkumar Manoharan .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID, 4774a16fbecSRajkumar Manoharan .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID, 4784a16fbecSRajkumar Manoharan .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 4794a16fbecSRajkumar Manoharan .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 4804a16fbecSRajkumar Manoharan .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 4814a16fbecSRajkumar Manoharan .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 4824a16fbecSRajkumar Manoharan .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, 4834a16fbecSRajkumar Manoharan .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, 484a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_10_2_PDEV_GET_TEMPERATURE_CMDID, 48562f77f09SMaharaja .pdev_enable_adaptive_cca_cmdid = WMI_10_2_SET_CCA_PARAMS, 486772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 487772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 488772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 489772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 490772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 491772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 492772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 493772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 494772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 495772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 496772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 497772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 498772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 499772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 500772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 501772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 502772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 503772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 504772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 505772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 506772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 507772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 508772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 509772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 510772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 511772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 512772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 513772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 514772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 515772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 516772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 517772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 518772b4aeeSRaja Mani .pdev_get_nfcal_power_cmdid = WMI_CMD_UNSUPPORTED, 519772b4aeeSRaja Mani .pdev_get_tpc_cmdid = WMI_CMD_UNSUPPORTED, 520772b4aeeSRaja Mani .pdev_get_ast_info_cmdid = WMI_CMD_UNSUPPORTED, 521772b4aeeSRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_CMD_UNSUPPORTED, 522772b4aeeSRaja Mani .pdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 523772b4aeeSRaja Mani .vdev_get_info_cmdid = WMI_CMD_UNSUPPORTED, 524772b4aeeSRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = WMI_CMD_UNSUPPORTED, 525772b4aeeSRaja Mani .mu_cal_start_cmdid = WMI_CMD_UNSUPPORTED, 526772b4aeeSRaja Mani .set_cca_params_cmdid = WMI_CMD_UNSUPPORTED, 5278a0b459eSRajkumar Manoharan .pdev_bss_chan_info_request_cmdid = 5288a0b459eSRajkumar Manoharan WMI_10_2_PDEV_BSS_CHAN_INFO_REQUEST_CMDID, 529bc64d052SMaharaja Kennadyrajan .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 5306f6eb1bcSSriram R .radar_found_cmdid = WMI_CMD_UNSUPPORTED, 53184758d4dSBhagavathi Perumal S .set_bb_timing_cmdid = WMI_10_2_PDEV_SET_BB_TIMING_CONFIG_CMDID, 5324a16fbecSRajkumar Manoharan }; 5334a16fbecSRajkumar Manoharan 5342d491e69SRaja Mani /* 10.4 WMI cmd track */ 5352d491e69SRaja Mani static struct wmi_cmd_map wmi_10_4_cmd_map = { 5362d491e69SRaja Mani .init_cmdid = WMI_10_4_INIT_CMDID, 5372d491e69SRaja Mani .start_scan_cmdid = WMI_10_4_START_SCAN_CMDID, 5382d491e69SRaja Mani .stop_scan_cmdid = WMI_10_4_STOP_SCAN_CMDID, 5392d491e69SRaja Mani .scan_chan_list_cmdid = WMI_10_4_SCAN_CHAN_LIST_CMDID, 5402d491e69SRaja Mani .scan_sch_prio_tbl_cmdid = WMI_10_4_SCAN_SCH_PRIO_TBL_CMDID, 54160e1d0fbSCarl Huang .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 5422d491e69SRaja Mani .pdev_set_regdomain_cmdid = WMI_10_4_PDEV_SET_REGDOMAIN_CMDID, 5432d491e69SRaja Mani .pdev_set_channel_cmdid = WMI_10_4_PDEV_SET_CHANNEL_CMDID, 5442d491e69SRaja Mani .pdev_set_param_cmdid = WMI_10_4_PDEV_SET_PARAM_CMDID, 5452d491e69SRaja Mani .pdev_pktlog_enable_cmdid = WMI_10_4_PDEV_PKTLOG_ENABLE_CMDID, 5462d491e69SRaja Mani .pdev_pktlog_disable_cmdid = WMI_10_4_PDEV_PKTLOG_DISABLE_CMDID, 5472d491e69SRaja Mani .pdev_set_wmm_params_cmdid = WMI_10_4_PDEV_SET_WMM_PARAMS_CMDID, 5482d491e69SRaja Mani .pdev_set_ht_cap_ie_cmdid = WMI_10_4_PDEV_SET_HT_CAP_IE_CMDID, 5492d491e69SRaja Mani .pdev_set_vht_cap_ie_cmdid = WMI_10_4_PDEV_SET_VHT_CAP_IE_CMDID, 5502d491e69SRaja Mani .pdev_set_dscp_tid_map_cmdid = WMI_10_4_PDEV_SET_DSCP_TID_MAP_CMDID, 5512d491e69SRaja Mani .pdev_set_quiet_mode_cmdid = WMI_10_4_PDEV_SET_QUIET_MODE_CMDID, 5522d491e69SRaja Mani .pdev_green_ap_ps_enable_cmdid = WMI_10_4_PDEV_GREEN_AP_PS_ENABLE_CMDID, 5532d491e69SRaja Mani .pdev_get_tpc_config_cmdid = WMI_10_4_PDEV_GET_TPC_CONFIG_CMDID, 5542d491e69SRaja Mani .pdev_set_base_macaddr_cmdid = WMI_10_4_PDEV_SET_BASE_MACADDR_CMDID, 5552d491e69SRaja Mani .vdev_create_cmdid = WMI_10_4_VDEV_CREATE_CMDID, 5562d491e69SRaja Mani .vdev_delete_cmdid = WMI_10_4_VDEV_DELETE_CMDID, 5572d491e69SRaja Mani .vdev_start_request_cmdid = WMI_10_4_VDEV_START_REQUEST_CMDID, 5582d491e69SRaja Mani .vdev_restart_request_cmdid = WMI_10_4_VDEV_RESTART_REQUEST_CMDID, 5592d491e69SRaja Mani .vdev_up_cmdid = WMI_10_4_VDEV_UP_CMDID, 5602d491e69SRaja Mani .vdev_stop_cmdid = WMI_10_4_VDEV_STOP_CMDID, 5612d491e69SRaja Mani .vdev_down_cmdid = WMI_10_4_VDEV_DOWN_CMDID, 5622d491e69SRaja Mani .vdev_set_param_cmdid = WMI_10_4_VDEV_SET_PARAM_CMDID, 5632d491e69SRaja Mani .vdev_install_key_cmdid = WMI_10_4_VDEV_INSTALL_KEY_CMDID, 5642d491e69SRaja Mani .peer_create_cmdid = WMI_10_4_PEER_CREATE_CMDID, 5652d491e69SRaja Mani .peer_delete_cmdid = WMI_10_4_PEER_DELETE_CMDID, 5662d491e69SRaja Mani .peer_flush_tids_cmdid = WMI_10_4_PEER_FLUSH_TIDS_CMDID, 5672d491e69SRaja Mani .peer_set_param_cmdid = WMI_10_4_PEER_SET_PARAM_CMDID, 5682d491e69SRaja Mani .peer_assoc_cmdid = WMI_10_4_PEER_ASSOC_CMDID, 5692d491e69SRaja Mani .peer_add_wds_entry_cmdid = WMI_10_4_PEER_ADD_WDS_ENTRY_CMDID, 5702d491e69SRaja Mani .peer_remove_wds_entry_cmdid = WMI_10_4_PEER_REMOVE_WDS_ENTRY_CMDID, 5712d491e69SRaja Mani .peer_mcast_group_cmdid = WMI_10_4_PEER_MCAST_GROUP_CMDID, 5722d491e69SRaja Mani .bcn_tx_cmdid = WMI_10_4_BCN_TX_CMDID, 5732d491e69SRaja Mani .pdev_send_bcn_cmdid = WMI_10_4_PDEV_SEND_BCN_CMDID, 5742d491e69SRaja Mani .bcn_tmpl_cmdid = WMI_10_4_BCN_PRB_TMPL_CMDID, 5752d491e69SRaja Mani .bcn_filter_rx_cmdid = WMI_10_4_BCN_FILTER_RX_CMDID, 5762d491e69SRaja Mani .prb_req_filter_rx_cmdid = WMI_10_4_PRB_REQ_FILTER_RX_CMDID, 5772d491e69SRaja Mani .mgmt_tx_cmdid = WMI_10_4_MGMT_TX_CMDID, 5782d491e69SRaja Mani .prb_tmpl_cmdid = WMI_10_4_PRB_TMPL_CMDID, 5792d491e69SRaja Mani .addba_clear_resp_cmdid = WMI_10_4_ADDBA_CLEAR_RESP_CMDID, 5802d491e69SRaja Mani .addba_send_cmdid = WMI_10_4_ADDBA_SEND_CMDID, 5812d491e69SRaja Mani .addba_status_cmdid = WMI_10_4_ADDBA_STATUS_CMDID, 5822d491e69SRaja Mani .delba_send_cmdid = WMI_10_4_DELBA_SEND_CMDID, 5832d491e69SRaja Mani .addba_set_resp_cmdid = WMI_10_4_ADDBA_SET_RESP_CMDID, 5842d491e69SRaja Mani .send_singleamsdu_cmdid = WMI_10_4_SEND_SINGLEAMSDU_CMDID, 5852d491e69SRaja Mani .sta_powersave_mode_cmdid = WMI_10_4_STA_POWERSAVE_MODE_CMDID, 5862d491e69SRaja Mani .sta_powersave_param_cmdid = WMI_10_4_STA_POWERSAVE_PARAM_CMDID, 5872d491e69SRaja Mani .sta_mimo_ps_mode_cmdid = WMI_10_4_STA_MIMO_PS_MODE_CMDID, 5882d491e69SRaja Mani .pdev_dfs_enable_cmdid = WMI_10_4_PDEV_DFS_ENABLE_CMDID, 5892d491e69SRaja Mani .pdev_dfs_disable_cmdid = WMI_10_4_PDEV_DFS_DISABLE_CMDID, 5902d491e69SRaja Mani .roam_scan_mode = WMI_10_4_ROAM_SCAN_MODE, 5912d491e69SRaja Mani .roam_scan_rssi_threshold = WMI_10_4_ROAM_SCAN_RSSI_THRESHOLD, 5922d491e69SRaja Mani .roam_scan_period = WMI_10_4_ROAM_SCAN_PERIOD, 5932d491e69SRaja Mani .roam_scan_rssi_change_threshold = 5942d491e69SRaja Mani WMI_10_4_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 5952d491e69SRaja Mani .roam_ap_profile = WMI_10_4_ROAM_AP_PROFILE, 5962d491e69SRaja Mani .ofl_scan_add_ap_profile = WMI_10_4_OFL_SCAN_ADD_AP_PROFILE, 5972d491e69SRaja Mani .ofl_scan_remove_ap_profile = WMI_10_4_OFL_SCAN_REMOVE_AP_PROFILE, 5982d491e69SRaja Mani .ofl_scan_period = WMI_10_4_OFL_SCAN_PERIOD, 5992d491e69SRaja Mani .p2p_dev_set_device_info = WMI_10_4_P2P_DEV_SET_DEVICE_INFO, 6002d491e69SRaja Mani .p2p_dev_set_discoverability = WMI_10_4_P2P_DEV_SET_DISCOVERABILITY, 6012d491e69SRaja Mani .p2p_go_set_beacon_ie = WMI_10_4_P2P_GO_SET_BEACON_IE, 6022d491e69SRaja Mani .p2p_go_set_probe_resp_ie = WMI_10_4_P2P_GO_SET_PROBE_RESP_IE, 6032d491e69SRaja Mani .p2p_set_vendor_ie_data_cmdid = WMI_10_4_P2P_SET_VENDOR_IE_DATA_CMDID, 6042d491e69SRaja Mani .ap_ps_peer_param_cmdid = WMI_10_4_AP_PS_PEER_PARAM_CMDID, 6052d491e69SRaja Mani .ap_ps_peer_uapsd_coex_cmdid = WMI_10_4_AP_PS_PEER_UAPSD_COEX_CMDID, 6062d491e69SRaja Mani .peer_rate_retry_sched_cmdid = WMI_10_4_PEER_RATE_RETRY_SCHED_CMDID, 6072d491e69SRaja Mani .wlan_profile_trigger_cmdid = WMI_10_4_WLAN_PROFILE_TRIGGER_CMDID, 6082d491e69SRaja Mani .wlan_profile_set_hist_intvl_cmdid = 6092d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 6102d491e69SRaja Mani .wlan_profile_get_profile_data_cmdid = 6112d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 6122d491e69SRaja Mani .wlan_profile_enable_profile_id_cmdid = 6132d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 6142d491e69SRaja Mani .wlan_profile_list_profile_id_cmdid = 6152d491e69SRaja Mani WMI_10_4_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 6162d491e69SRaja Mani .pdev_suspend_cmdid = WMI_10_4_PDEV_SUSPEND_CMDID, 6172d491e69SRaja Mani .pdev_resume_cmdid = WMI_10_4_PDEV_RESUME_CMDID, 6182d491e69SRaja Mani .add_bcn_filter_cmdid = WMI_10_4_ADD_BCN_FILTER_CMDID, 6192d491e69SRaja Mani .rmv_bcn_filter_cmdid = WMI_10_4_RMV_BCN_FILTER_CMDID, 6202d491e69SRaja Mani .wow_add_wake_pattern_cmdid = WMI_10_4_WOW_ADD_WAKE_PATTERN_CMDID, 6212d491e69SRaja Mani .wow_del_wake_pattern_cmdid = WMI_10_4_WOW_DEL_WAKE_PATTERN_CMDID, 6222d491e69SRaja Mani .wow_enable_disable_wake_event_cmdid = 6232d491e69SRaja Mani WMI_10_4_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 6242d491e69SRaja Mani .wow_enable_cmdid = WMI_10_4_WOW_ENABLE_CMDID, 6252d491e69SRaja Mani .wow_hostwakeup_from_sleep_cmdid = 6262d491e69SRaja Mani WMI_10_4_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 6272d491e69SRaja Mani .rtt_measreq_cmdid = WMI_10_4_RTT_MEASREQ_CMDID, 6282d491e69SRaja Mani .rtt_tsf_cmdid = WMI_10_4_RTT_TSF_CMDID, 6292d491e69SRaja Mani .vdev_spectral_scan_configure_cmdid = 6302d491e69SRaja Mani WMI_10_4_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 6312d491e69SRaja Mani .vdev_spectral_scan_enable_cmdid = 6322d491e69SRaja Mani WMI_10_4_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 6332d491e69SRaja Mani .request_stats_cmdid = WMI_10_4_REQUEST_STATS_CMDID, 6342d491e69SRaja Mani .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 6352d491e69SRaja Mani .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 6362d491e69SRaja Mani .gtk_offload_cmdid = WMI_10_4_GTK_OFFLOAD_CMDID, 6372d491e69SRaja Mani .csa_offload_enable_cmdid = WMI_10_4_CSA_OFFLOAD_ENABLE_CMDID, 6382d491e69SRaja Mani .csa_offload_chanswitch_cmdid = WMI_10_4_CSA_OFFLOAD_CHANSWITCH_CMDID, 6392d491e69SRaja Mani .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 6402d491e69SRaja Mani .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 6412d491e69SRaja Mani .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 6422d491e69SRaja Mani .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 6432d491e69SRaja Mani .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 6442d491e69SRaja Mani .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 6452d491e69SRaja Mani .echo_cmdid = WMI_10_4_ECHO_CMDID, 6462d491e69SRaja Mani .pdev_utf_cmdid = WMI_10_4_PDEV_UTF_CMDID, 6472d491e69SRaja Mani .dbglog_cfg_cmdid = WMI_10_4_DBGLOG_CFG_CMDID, 6482d491e69SRaja Mani .pdev_qvit_cmdid = WMI_10_4_PDEV_QVIT_CMDID, 6492d491e69SRaja Mani .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 6502d491e69SRaja Mani .vdev_set_keepalive_cmdid = WMI_10_4_VDEV_SET_KEEPALIVE_CMDID, 6512d491e69SRaja Mani .vdev_get_keepalive_cmdid = WMI_10_4_VDEV_GET_KEEPALIVE_CMDID, 6522d491e69SRaja Mani .force_fw_hang_cmdid = WMI_10_4_FORCE_FW_HANG_CMDID, 6532d491e69SRaja Mani .gpio_config_cmdid = WMI_10_4_GPIO_CONFIG_CMDID, 6542d491e69SRaja Mani .gpio_output_cmdid = WMI_10_4_GPIO_OUTPUT_CMDID, 6552d491e69SRaja Mani .pdev_get_temperature_cmdid = WMI_10_4_PDEV_GET_TEMPERATURE_CMDID, 6562d491e69SRaja Mani .vdev_set_wmm_params_cmdid = WMI_CMD_UNSUPPORTED, 6572d491e69SRaja Mani .adaptive_qcs_cmdid = WMI_CMD_UNSUPPORTED, 6582d491e69SRaja Mani .scan_update_request_cmdid = WMI_10_4_SCAN_UPDATE_REQUEST_CMDID, 6592d491e69SRaja Mani .vdev_standby_response_cmdid = WMI_10_4_VDEV_STANDBY_RESPONSE_CMDID, 6602d491e69SRaja Mani .vdev_resume_response_cmdid = WMI_10_4_VDEV_RESUME_RESPONSE_CMDID, 6612d491e69SRaja Mani .wlan_peer_caching_add_peer_cmdid = 6622d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_ADD_PEER_CMDID, 6632d491e69SRaja Mani .wlan_peer_caching_evict_peer_cmdid = 6642d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_EVICT_PEER_CMDID, 6652d491e69SRaja Mani .wlan_peer_caching_restore_peer_cmdid = 6662d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_RESTORE_PEER_CMDID, 6672d491e69SRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = 6682d491e69SRaja Mani WMI_10_4_WLAN_PEER_CACHING_PRINT_ALL_PEERS_INFO_CMDID, 6692d491e69SRaja Mani .peer_update_wds_entry_cmdid = WMI_10_4_PEER_UPDATE_WDS_ENTRY_CMDID, 6702d491e69SRaja Mani .peer_add_proxy_sta_entry_cmdid = 6712d491e69SRaja Mani WMI_10_4_PEER_ADD_PROXY_STA_ENTRY_CMDID, 6722d491e69SRaja Mani .rtt_keepalive_cmdid = WMI_10_4_RTT_KEEPALIVE_CMDID, 6732d491e69SRaja Mani .oem_req_cmdid = WMI_10_4_OEM_REQ_CMDID, 6742d491e69SRaja Mani .nan_cmdid = WMI_10_4_NAN_CMDID, 6752d491e69SRaja Mani .vdev_ratemask_cmdid = WMI_10_4_VDEV_RATEMASK_CMDID, 6762d491e69SRaja Mani .qboost_cfg_cmdid = WMI_10_4_QBOOST_CFG_CMDID, 6772d491e69SRaja Mani .pdev_smart_ant_enable_cmdid = WMI_10_4_PDEV_SMART_ANT_ENABLE_CMDID, 6782d491e69SRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = 6792d491e69SRaja Mani WMI_10_4_PDEV_SMART_ANT_SET_RX_ANTENNA_CMDID, 6802d491e69SRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = 6812d491e69SRaja Mani WMI_10_4_PEER_SMART_ANT_SET_TX_ANTENNA_CMDID, 6822d491e69SRaja Mani .peer_smart_ant_set_train_info_cmdid = 6832d491e69SRaja Mani WMI_10_4_PEER_SMART_ANT_SET_TRAIN_INFO_CMDID, 6842d491e69SRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = 6852d491e69SRaja Mani WMI_10_4_PEER_SMART_ANT_SET_NODE_CONFIG_OPS_CMDID, 6862d491e69SRaja Mani .pdev_set_antenna_switch_table_cmdid = 6872d491e69SRaja Mani WMI_10_4_PDEV_SET_ANTENNA_SWITCH_TABLE_CMDID, 6882d491e69SRaja Mani .pdev_set_ctl_table_cmdid = WMI_10_4_PDEV_SET_CTL_TABLE_CMDID, 6892d491e69SRaja Mani .pdev_set_mimogain_table_cmdid = WMI_10_4_PDEV_SET_MIMOGAIN_TABLE_CMDID, 6902d491e69SRaja Mani .pdev_ratepwr_table_cmdid = WMI_10_4_PDEV_RATEPWR_TABLE_CMDID, 6912d491e69SRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = 6922d491e69SRaja Mani WMI_10_4_PDEV_RATEPWR_CHAINMSK_TABLE_CMDID, 6932d491e69SRaja Mani .pdev_fips_cmdid = WMI_10_4_PDEV_FIPS_CMDID, 6942d491e69SRaja Mani .tt_set_conf_cmdid = WMI_10_4_TT_SET_CONF_CMDID, 6952d491e69SRaja Mani .fwtest_cmdid = WMI_10_4_FWTEST_CMDID, 6962d491e69SRaja Mani .vdev_atf_request_cmdid = WMI_10_4_VDEV_ATF_REQUEST_CMDID, 6972d491e69SRaja Mani .peer_atf_request_cmdid = WMI_10_4_PEER_ATF_REQUEST_CMDID, 6982d491e69SRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_10_4_PDEV_GET_ANI_CCK_CONFIG_CMDID, 6992d491e69SRaja Mani .pdev_get_ani_ofdm_config_cmdid = 7002d491e69SRaja Mani WMI_10_4_PDEV_GET_ANI_OFDM_CONFIG_CMDID, 7012d491e69SRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_10_4_PDEV_RESERVE_AST_ENTRY_CMDID, 7022d491e69SRaja Mani .pdev_get_nfcal_power_cmdid = WMI_10_4_PDEV_GET_NFCAL_POWER_CMDID, 7032d491e69SRaja Mani .pdev_get_tpc_cmdid = WMI_10_4_PDEV_GET_TPC_CMDID, 7042d491e69SRaja Mani .pdev_get_ast_info_cmdid = WMI_10_4_PDEV_GET_AST_INFO_CMDID, 7052d491e69SRaja Mani .vdev_set_dscp_tid_map_cmdid = WMI_10_4_VDEV_SET_DSCP_TID_MAP_CMDID, 7062d491e69SRaja Mani .pdev_get_info_cmdid = WMI_10_4_PDEV_GET_INFO_CMDID, 7072d491e69SRaja Mani .vdev_get_info_cmdid = WMI_10_4_VDEV_GET_INFO_CMDID, 7082d491e69SRaja Mani .vdev_filter_neighbor_rx_packets_cmdid = 7092d491e69SRaja Mani WMI_10_4_VDEV_FILTER_NEIGHBOR_RX_PACKETS_CMDID, 7102d491e69SRaja Mani .mu_cal_start_cmdid = WMI_10_4_MU_CAL_START_CMDID, 7112d491e69SRaja Mani .set_cca_params_cmdid = WMI_10_4_SET_CCA_PARAMS_CMDID, 7122d491e69SRaja Mani .pdev_bss_chan_info_request_cmdid = 7132d491e69SRaja Mani WMI_10_4_PDEV_BSS_CHAN_INFO_REQUEST_CMDID, 71447771902SRaja Mani .ext_resource_cfg_cmdid = WMI_10_4_EXT_RESOURCE_CFG_CMDID, 715add6cd8dSManikanta Pubbisetty .vdev_set_ie_cmdid = WMI_10_4_VDEV_SET_IE_CMDID, 716add6cd8dSManikanta Pubbisetty .set_lteu_config_cmdid = WMI_10_4_SET_LTEU_CONFIG_CMDID, 717add6cd8dSManikanta Pubbisetty .atf_ssid_grouping_request_cmdid = 718add6cd8dSManikanta Pubbisetty WMI_10_4_ATF_SSID_GROUPING_REQUEST_CMDID, 719add6cd8dSManikanta Pubbisetty .peer_atf_ext_request_cmdid = WMI_10_4_PEER_ATF_EXT_REQUEST_CMDID, 720add6cd8dSManikanta Pubbisetty .set_periodic_channel_stats_cfg_cmdid = 721add6cd8dSManikanta Pubbisetty WMI_10_4_SET_PERIODIC_CHANNEL_STATS_CONFIG, 722add6cd8dSManikanta Pubbisetty .peer_bwf_request_cmdid = WMI_10_4_PEER_BWF_REQUEST_CMDID, 723add6cd8dSManikanta Pubbisetty .btcoex_cfg_cmdid = WMI_10_4_BTCOEX_CFG_CMDID, 724add6cd8dSManikanta Pubbisetty .peer_tx_mu_txmit_count_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_COUNT_CMDID, 725add6cd8dSManikanta Pubbisetty .peer_tx_mu_txmit_rstcnt_cmdid = WMI_10_4_PEER_TX_MU_TXMIT_RSTCNT_CMDID, 726add6cd8dSManikanta Pubbisetty .peer_gid_userpos_list_cmdid = WMI_10_4_PEER_GID_USERPOS_LIST_CMDID, 727add6cd8dSManikanta Pubbisetty .pdev_check_cal_version_cmdid = WMI_10_4_PDEV_CHECK_CAL_VERSION_CMDID, 728add6cd8dSManikanta Pubbisetty .coex_version_cfg_cmid = WMI_10_4_COEX_VERSION_CFG_CMID, 729add6cd8dSManikanta Pubbisetty .pdev_get_rx_filter_cmdid = WMI_10_4_PDEV_GET_RX_FILTER_CMDID, 730add6cd8dSManikanta Pubbisetty .pdev_extended_nss_cfg_cmdid = WMI_10_4_PDEV_EXTENDED_NSS_CFG_CMDID, 731add6cd8dSManikanta Pubbisetty .vdev_set_scan_nac_rssi_cmdid = WMI_10_4_VDEV_SET_SCAN_NAC_RSSI_CMDID, 732add6cd8dSManikanta Pubbisetty .prog_gpio_band_select_cmdid = WMI_10_4_PROG_GPIO_BAND_SELECT_CMDID, 733add6cd8dSManikanta Pubbisetty .config_smart_logging_cmdid = WMI_10_4_CONFIG_SMART_LOGGING_CMDID, 734add6cd8dSManikanta Pubbisetty .debug_fatal_condition_cmdid = WMI_10_4_DEBUG_FATAL_CONDITION_CMDID, 735add6cd8dSManikanta Pubbisetty .get_tsf_timer_cmdid = WMI_10_4_GET_TSF_TIMER_CMDID, 736add6cd8dSManikanta Pubbisetty .pdev_get_tpc_table_cmdid = WMI_10_4_PDEV_GET_TPC_TABLE_CMDID, 737add6cd8dSManikanta Pubbisetty .vdev_sifs_trigger_time_cmdid = WMI_10_4_VDEV_SIFS_TRIGGER_TIME_CMDID, 738add6cd8dSManikanta Pubbisetty .pdev_wds_entry_list_cmdid = WMI_10_4_PDEV_WDS_ENTRY_LIST_CMDID, 739add6cd8dSManikanta Pubbisetty .tdls_set_state_cmdid = WMI_10_4_TDLS_SET_STATE_CMDID, 740add6cd8dSManikanta Pubbisetty .tdls_peer_update_cmdid = WMI_10_4_TDLS_PEER_UPDATE_CMDID, 741add6cd8dSManikanta Pubbisetty .tdls_set_offchan_mode_cmdid = WMI_10_4_TDLS_SET_OFFCHAN_MODE_CMDID, 7426f6eb1bcSSriram R .radar_found_cmdid = WMI_10_4_RADAR_FOUND_CMDID, 7432d491e69SRaja Mani }; 7442d491e69SRaja Mani 745c0e33fe6SRakesh Pillai static struct wmi_peer_param_map wmi_peer_param_map = { 746c0e33fe6SRakesh Pillai .smps_state = WMI_PEER_SMPS_STATE, 747c0e33fe6SRakesh Pillai .ampdu = WMI_PEER_AMPDU, 748c0e33fe6SRakesh Pillai .authorize = WMI_PEER_AUTHORIZE, 749c0e33fe6SRakesh Pillai .chan_width = WMI_PEER_CHAN_WIDTH, 750c0e33fe6SRakesh Pillai .nss = WMI_PEER_NSS, 751c0e33fe6SRakesh Pillai .use_4addr = WMI_PEER_USE_4ADDR, 752c0e33fe6SRakesh Pillai .use_fixed_power = WMI_PEER_USE_FIXED_PWR, 753c0e33fe6SRakesh Pillai .debug = WMI_PEER_DEBUG, 754c0e33fe6SRakesh Pillai .phymode = WMI_PEER_PHYMODE, 755c0e33fe6SRakesh Pillai .dummy_var = WMI_PEER_DUMMY_VAR, 756c0e33fe6SRakesh Pillai }; 757c0e33fe6SRakesh Pillai 7586d1506e7SBartosz Markowski /* MAIN WMI VDEV param map */ 7596d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_vdev_param_map = { 7606d1506e7SBartosz Markowski .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD, 7616d1506e7SBartosz Markowski .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 7626d1506e7SBartosz Markowski .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL, 7636d1506e7SBartosz Markowski .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL, 7646d1506e7SBartosz Markowski .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE, 7656d1506e7SBartosz Markowski .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE, 7666d1506e7SBartosz Markowski .slot_time = WMI_VDEV_PARAM_SLOT_TIME, 7676d1506e7SBartosz Markowski .preamble = WMI_VDEV_PARAM_PREAMBLE, 7686d1506e7SBartosz Markowski .swba_time = WMI_VDEV_PARAM_SWBA_TIME, 7696d1506e7SBartosz Markowski .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD, 7706d1506e7SBartosz Markowski .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME, 7716d1506e7SBartosz Markowski .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL, 7726d1506e7SBartosz Markowski .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD, 7736d1506e7SBartosz Markowski .wmi_vdev_oc_scheduler_air_time_limit = 7746d1506e7SBartosz Markowski WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 7756d1506e7SBartosz Markowski .wds = WMI_VDEV_PARAM_WDS, 7766d1506e7SBartosz Markowski .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW, 7776d1506e7SBartosz Markowski .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX, 7786d1506e7SBartosz Markowski .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT, 7796d1506e7SBartosz Markowski .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT, 7806d1506e7SBartosz Markowski .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM, 7816d1506e7SBartosz Markowski .chwidth = WMI_VDEV_PARAM_CHWIDTH, 7826d1506e7SBartosz Markowski .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET, 7836d1506e7SBartosz Markowski .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION, 7846d1506e7SBartosz Markowski .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT, 7856d1506e7SBartosz Markowski .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE, 7866d1506e7SBartosz Markowski .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE, 7876d1506e7SBartosz Markowski .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE, 7886d1506e7SBartosz Markowski .sgi = WMI_VDEV_PARAM_SGI, 7896d1506e7SBartosz Markowski .ldpc = WMI_VDEV_PARAM_LDPC, 7906d1506e7SBartosz Markowski .tx_stbc = WMI_VDEV_PARAM_TX_STBC, 7916d1506e7SBartosz Markowski .rx_stbc = WMI_VDEV_PARAM_RX_STBC, 7926d1506e7SBartosz Markowski .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD, 7936d1506e7SBartosz Markowski .def_keyid = WMI_VDEV_PARAM_DEF_KEYID, 7946d1506e7SBartosz Markowski .nss = WMI_VDEV_PARAM_NSS, 7956d1506e7SBartosz Markowski .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE, 7966d1506e7SBartosz Markowski .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE, 7976d1506e7SBartosz Markowski .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE, 7986d1506e7SBartosz Markowski .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE, 7996d1506e7SBartosz Markowski .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 8006d1506e7SBartosz Markowski .ap_keepalive_min_idle_inactive_time_secs = 8016d1506e7SBartosz Markowski WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 8026d1506e7SBartosz Markowski .ap_keepalive_max_idle_inactive_time_secs = 8036d1506e7SBartosz Markowski WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 8046d1506e7SBartosz Markowski .ap_keepalive_max_unresponsive_time_secs = 8056d1506e7SBartosz Markowski WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 8066d1506e7SBartosz Markowski .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS, 8076d1506e7SBartosz Markowski .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED, 8086d1506e7SBartosz Markowski .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS, 8096d1506e7SBartosz Markowski .txbf = WMI_VDEV_PARAM_TXBF, 8106d1506e7SBartosz Markowski .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE, 8116d1506e7SBartosz Markowski .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY, 8126d1506e7SBartosz Markowski .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE, 8136d1506e7SBartosz Markowski .ap_detect_out_of_sync_sleeping_sta_time_secs = 8146d1506e7SBartosz Markowski WMI_VDEV_PARAM_UNSUPPORTED, 81593841a15SRaja Mani .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 81693841a15SRaja Mani .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 81793841a15SRaja Mani .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 81893841a15SRaja Mani .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 81993841a15SRaja Mani .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 82093841a15SRaja Mani .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 82193841a15SRaja Mani .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 82293841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 82393841a15SRaja Mani .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 82493841a15SRaja Mani .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 82593841a15SRaja Mani .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 82693841a15SRaja Mani .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 82793841a15SRaja Mani .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 82893841a15SRaja Mani .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 82993841a15SRaja Mani .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 83093841a15SRaja Mani .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 83168c295f2SSathishkumar Muruganandam .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED, 832059104bfSPradeep Kumar Chitrapu .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED, 8336d1506e7SBartosz Markowski }; 8346d1506e7SBartosz Markowski 8356d1506e7SBartosz Markowski /* 10.X WMI VDEV param map */ 8366d1506e7SBartosz Markowski static struct wmi_vdev_param_map wmi_10x_vdev_param_map = { 8376d1506e7SBartosz Markowski .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD, 8386d1506e7SBartosz Markowski .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 8396d1506e7SBartosz Markowski .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL, 8406d1506e7SBartosz Markowski .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL, 8416d1506e7SBartosz Markowski .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE, 8426d1506e7SBartosz Markowski .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE, 8436d1506e7SBartosz Markowski .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME, 8446d1506e7SBartosz Markowski .preamble = WMI_10X_VDEV_PARAM_PREAMBLE, 8456d1506e7SBartosz Markowski .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME, 8466d1506e7SBartosz Markowski .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD, 8476d1506e7SBartosz Markowski .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME, 8486d1506e7SBartosz Markowski .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL, 8496d1506e7SBartosz Markowski .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD, 8506d1506e7SBartosz Markowski .wmi_vdev_oc_scheduler_air_time_limit = 8516d1506e7SBartosz Markowski WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 8526d1506e7SBartosz Markowski .wds = WMI_10X_VDEV_PARAM_WDS, 8536d1506e7SBartosz Markowski .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW, 8546d1506e7SBartosz Markowski .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX, 8556d1506e7SBartosz Markowski .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 8566d1506e7SBartosz Markowski .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 8576d1506e7SBartosz Markowski .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM, 8586d1506e7SBartosz Markowski .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH, 8596d1506e7SBartosz Markowski .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET, 8606d1506e7SBartosz Markowski .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION, 8616d1506e7SBartosz Markowski .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT, 8626d1506e7SBartosz Markowski .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE, 8636d1506e7SBartosz Markowski .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE, 8646d1506e7SBartosz Markowski .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE, 8656d1506e7SBartosz Markowski .sgi = WMI_10X_VDEV_PARAM_SGI, 8666d1506e7SBartosz Markowski .ldpc = WMI_10X_VDEV_PARAM_LDPC, 8676d1506e7SBartosz Markowski .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC, 8686d1506e7SBartosz Markowski .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC, 8696d1506e7SBartosz Markowski .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD, 8706d1506e7SBartosz Markowski .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID, 8716d1506e7SBartosz Markowski .nss = WMI_10X_VDEV_PARAM_NSS, 8726d1506e7SBartosz Markowski .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE, 8736d1506e7SBartosz Markowski .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE, 8746d1506e7SBartosz Markowski .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE, 8756d1506e7SBartosz Markowski .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE, 8766d1506e7SBartosz Markowski .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 8776d1506e7SBartosz Markowski .ap_keepalive_min_idle_inactive_time_secs = 8786d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 8796d1506e7SBartosz Markowski .ap_keepalive_max_idle_inactive_time_secs = 8806d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 8816d1506e7SBartosz Markowski .ap_keepalive_max_unresponsive_time_secs = 8826d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 8836d1506e7SBartosz Markowski .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS, 8846d1506e7SBartosz Markowski .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET, 8856d1506e7SBartosz Markowski .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS, 8866d1506e7SBartosz Markowski .txbf = WMI_VDEV_PARAM_UNSUPPORTED, 8876d1506e7SBartosz Markowski .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED, 8886d1506e7SBartosz Markowski .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED, 8896d1506e7SBartosz Markowski .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED, 8906d1506e7SBartosz Markowski .ap_detect_out_of_sync_sleeping_sta_time_secs = 8916d1506e7SBartosz Markowski WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 89293841a15SRaja Mani .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 89393841a15SRaja Mani .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 89493841a15SRaja Mani .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 89593841a15SRaja Mani .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 89693841a15SRaja Mani .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 89793841a15SRaja Mani .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 89893841a15SRaja Mani .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 89993841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 90093841a15SRaja Mani .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 90193841a15SRaja Mani .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 90293841a15SRaja Mani .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 90393841a15SRaja Mani .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 90493841a15SRaja Mani .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 90593841a15SRaja Mani .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 90693841a15SRaja Mani .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 90793841a15SRaja Mani .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 90868c295f2SSathishkumar Muruganandam .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED, 909059104bfSPradeep Kumar Chitrapu .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED, 9106d1506e7SBartosz Markowski }; 9116d1506e7SBartosz Markowski 9124a16fbecSRajkumar Manoharan static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = { 9134a16fbecSRajkumar Manoharan .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD, 9144a16fbecSRajkumar Manoharan .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 9154a16fbecSRajkumar Manoharan .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL, 9164a16fbecSRajkumar Manoharan .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL, 9174a16fbecSRajkumar Manoharan .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE, 9184a16fbecSRajkumar Manoharan .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE, 9194a16fbecSRajkumar Manoharan .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME, 9204a16fbecSRajkumar Manoharan .preamble = WMI_10X_VDEV_PARAM_PREAMBLE, 9214a16fbecSRajkumar Manoharan .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME, 9224a16fbecSRajkumar Manoharan .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD, 9234a16fbecSRajkumar Manoharan .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME, 9244a16fbecSRajkumar Manoharan .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL, 9254a16fbecSRajkumar Manoharan .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD, 9264a16fbecSRajkumar Manoharan .wmi_vdev_oc_scheduler_air_time_limit = 9274a16fbecSRajkumar Manoharan WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 9284a16fbecSRajkumar Manoharan .wds = WMI_10X_VDEV_PARAM_WDS, 9294a16fbecSRajkumar Manoharan .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW, 9304a16fbecSRajkumar Manoharan .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX, 9314a16fbecSRajkumar Manoharan .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 9324a16fbecSRajkumar Manoharan .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, 9334a16fbecSRajkumar Manoharan .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM, 9344a16fbecSRajkumar Manoharan .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH, 9354a16fbecSRajkumar Manoharan .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET, 9364a16fbecSRajkumar Manoharan .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION, 9374a16fbecSRajkumar Manoharan .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT, 9384a16fbecSRajkumar Manoharan .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE, 9394a16fbecSRajkumar Manoharan .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE, 9404a16fbecSRajkumar Manoharan .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE, 9414a16fbecSRajkumar Manoharan .sgi = WMI_10X_VDEV_PARAM_SGI, 9424a16fbecSRajkumar Manoharan .ldpc = WMI_10X_VDEV_PARAM_LDPC, 9434a16fbecSRajkumar Manoharan .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC, 9444a16fbecSRajkumar Manoharan .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC, 9454a16fbecSRajkumar Manoharan .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD, 9464a16fbecSRajkumar Manoharan .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID, 9474a16fbecSRajkumar Manoharan .nss = WMI_10X_VDEV_PARAM_NSS, 9484a16fbecSRajkumar Manoharan .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE, 9494a16fbecSRajkumar Manoharan .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE, 9504a16fbecSRajkumar Manoharan .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE, 9514a16fbecSRajkumar Manoharan .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE, 9524a16fbecSRajkumar Manoharan .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 9534a16fbecSRajkumar Manoharan .ap_keepalive_min_idle_inactive_time_secs = 9544a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 9554a16fbecSRajkumar Manoharan .ap_keepalive_max_idle_inactive_time_secs = 9564a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 9574a16fbecSRajkumar Manoharan .ap_keepalive_max_unresponsive_time_secs = 9584a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 9594a16fbecSRajkumar Manoharan .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS, 9604a16fbecSRajkumar Manoharan .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET, 9614a16fbecSRajkumar Manoharan .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS, 9624a16fbecSRajkumar Manoharan .txbf = WMI_VDEV_PARAM_UNSUPPORTED, 9634a16fbecSRajkumar Manoharan .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED, 9644a16fbecSRajkumar Manoharan .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED, 9654a16fbecSRajkumar Manoharan .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED, 9664a16fbecSRajkumar Manoharan .ap_detect_out_of_sync_sleeping_sta_time_secs = 9674a16fbecSRajkumar Manoharan WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 96893841a15SRaja Mani .rc_num_retries = WMI_VDEV_PARAM_UNSUPPORTED, 96993841a15SRaja Mani .cabq_maxdur = WMI_VDEV_PARAM_UNSUPPORTED, 97093841a15SRaja Mani .mfptest_set = WMI_VDEV_PARAM_UNSUPPORTED, 97193841a15SRaja Mani .rts_fixed_rate = WMI_VDEV_PARAM_UNSUPPORTED, 97293841a15SRaja Mani .vht_sgimask = WMI_VDEV_PARAM_UNSUPPORTED, 97393841a15SRaja Mani .vht80_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 97493841a15SRaja Mani .early_rx_adjust_enable = WMI_VDEV_PARAM_UNSUPPORTED, 97593841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_VDEV_PARAM_UNSUPPORTED, 97693841a15SRaja Mani .early_rx_bmiss_sample_cycle = WMI_VDEV_PARAM_UNSUPPORTED, 97793841a15SRaja Mani .early_rx_slop_step = WMI_VDEV_PARAM_UNSUPPORTED, 97893841a15SRaja Mani .early_rx_init_slop = WMI_VDEV_PARAM_UNSUPPORTED, 97993841a15SRaja Mani .early_rx_adjust_pause = WMI_VDEV_PARAM_UNSUPPORTED, 98093841a15SRaja Mani .proxy_sta = WMI_VDEV_PARAM_UNSUPPORTED, 98193841a15SRaja Mani .meru_vc = WMI_VDEV_PARAM_UNSUPPORTED, 98293841a15SRaja Mani .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED, 98393841a15SRaja Mani .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED, 98468c295f2SSathishkumar Muruganandam .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED, 985059104bfSPradeep Kumar Chitrapu .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED, 98693841a15SRaja Mani }; 98793841a15SRaja Mani 98893841a15SRaja Mani static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = { 98993841a15SRaja Mani .rts_threshold = WMI_10_4_VDEV_PARAM_RTS_THRESHOLD, 99093841a15SRaja Mani .fragmentation_threshold = WMI_10_4_VDEV_PARAM_FRAGMENTATION_THRESHOLD, 99193841a15SRaja Mani .beacon_interval = WMI_10_4_VDEV_PARAM_BEACON_INTERVAL, 99293841a15SRaja Mani .listen_interval = WMI_10_4_VDEV_PARAM_LISTEN_INTERVAL, 99393841a15SRaja Mani .multicast_rate = WMI_10_4_VDEV_PARAM_MULTICAST_RATE, 99493841a15SRaja Mani .mgmt_tx_rate = WMI_10_4_VDEV_PARAM_MGMT_TX_RATE, 99593841a15SRaja Mani .slot_time = WMI_10_4_VDEV_PARAM_SLOT_TIME, 99693841a15SRaja Mani .preamble = WMI_10_4_VDEV_PARAM_PREAMBLE, 99793841a15SRaja Mani .swba_time = WMI_10_4_VDEV_PARAM_SWBA_TIME, 99893841a15SRaja Mani .wmi_vdev_stats_update_period = WMI_10_4_VDEV_STATS_UPDATE_PERIOD, 99993841a15SRaja Mani .wmi_vdev_pwrsave_ageout_time = WMI_10_4_VDEV_PWRSAVE_AGEOUT_TIME, 100093841a15SRaja Mani .wmi_vdev_host_swba_interval = WMI_10_4_VDEV_HOST_SWBA_INTERVAL, 100193841a15SRaja Mani .dtim_period = WMI_10_4_VDEV_PARAM_DTIM_PERIOD, 100293841a15SRaja Mani .wmi_vdev_oc_scheduler_air_time_limit = 100393841a15SRaja Mani WMI_10_4_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, 100493841a15SRaja Mani .wds = WMI_10_4_VDEV_PARAM_WDS, 100593841a15SRaja Mani .atim_window = WMI_10_4_VDEV_PARAM_ATIM_WINDOW, 100693841a15SRaja Mani .bmiss_count_max = WMI_10_4_VDEV_PARAM_BMISS_COUNT_MAX, 100793841a15SRaja Mani .bmiss_first_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FIRST_BCNT, 100893841a15SRaja Mani .bmiss_final_bcnt = WMI_10_4_VDEV_PARAM_BMISS_FINAL_BCNT, 100993841a15SRaja Mani .feature_wmm = WMI_10_4_VDEV_PARAM_FEATURE_WMM, 101093841a15SRaja Mani .chwidth = WMI_10_4_VDEV_PARAM_CHWIDTH, 101193841a15SRaja Mani .chextoffset = WMI_10_4_VDEV_PARAM_CHEXTOFFSET, 101293841a15SRaja Mani .disable_htprotection = WMI_10_4_VDEV_PARAM_DISABLE_HTPROTECTION, 101393841a15SRaja Mani .sta_quickkickout = WMI_10_4_VDEV_PARAM_STA_QUICKKICKOUT, 101493841a15SRaja Mani .mgmt_rate = WMI_10_4_VDEV_PARAM_MGMT_RATE, 101593841a15SRaja Mani .protection_mode = WMI_10_4_VDEV_PARAM_PROTECTION_MODE, 101693841a15SRaja Mani .fixed_rate = WMI_10_4_VDEV_PARAM_FIXED_RATE, 101793841a15SRaja Mani .sgi = WMI_10_4_VDEV_PARAM_SGI, 101893841a15SRaja Mani .ldpc = WMI_10_4_VDEV_PARAM_LDPC, 101993841a15SRaja Mani .tx_stbc = WMI_10_4_VDEV_PARAM_TX_STBC, 102093841a15SRaja Mani .rx_stbc = WMI_10_4_VDEV_PARAM_RX_STBC, 102193841a15SRaja Mani .intra_bss_fwd = WMI_10_4_VDEV_PARAM_INTRA_BSS_FWD, 102293841a15SRaja Mani .def_keyid = WMI_10_4_VDEV_PARAM_DEF_KEYID, 102393841a15SRaja Mani .nss = WMI_10_4_VDEV_PARAM_NSS, 102493841a15SRaja Mani .bcast_data_rate = WMI_10_4_VDEV_PARAM_BCAST_DATA_RATE, 102593841a15SRaja Mani .mcast_data_rate = WMI_10_4_VDEV_PARAM_MCAST_DATA_RATE, 102693841a15SRaja Mani .mcast_indicate = WMI_10_4_VDEV_PARAM_MCAST_INDICATE, 102793841a15SRaja Mani .dhcp_indicate = WMI_10_4_VDEV_PARAM_DHCP_INDICATE, 102893841a15SRaja Mani .unknown_dest_indicate = WMI_10_4_VDEV_PARAM_UNKNOWN_DEST_INDICATE, 102993841a15SRaja Mani .ap_keepalive_min_idle_inactive_time_secs = 103093841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, 103193841a15SRaja Mani .ap_keepalive_max_idle_inactive_time_secs = 103293841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, 103393841a15SRaja Mani .ap_keepalive_max_unresponsive_time_secs = 103493841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, 103593841a15SRaja Mani .ap_enable_nawds = WMI_10_4_VDEV_PARAM_AP_ENABLE_NAWDS, 103693841a15SRaja Mani .mcast2ucast_set = WMI_10_4_VDEV_PARAM_MCAST2UCAST_SET, 103793841a15SRaja Mani .enable_rtscts = WMI_10_4_VDEV_PARAM_ENABLE_RTSCTS, 103893841a15SRaja Mani .txbf = WMI_10_4_VDEV_PARAM_TXBF, 103993841a15SRaja Mani .packet_powersave = WMI_10_4_VDEV_PARAM_PACKET_POWERSAVE, 104093841a15SRaja Mani .drop_unencry = WMI_10_4_VDEV_PARAM_DROP_UNENCRY, 104193841a15SRaja Mani .tx_encap_type = WMI_10_4_VDEV_PARAM_TX_ENCAP_TYPE, 104293841a15SRaja Mani .ap_detect_out_of_sync_sleeping_sta_time_secs = 104393841a15SRaja Mani WMI_10_4_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, 104493841a15SRaja Mani .rc_num_retries = WMI_10_4_VDEV_PARAM_RC_NUM_RETRIES, 104593841a15SRaja Mani .cabq_maxdur = WMI_10_4_VDEV_PARAM_CABQ_MAXDUR, 104693841a15SRaja Mani .mfptest_set = WMI_10_4_VDEV_PARAM_MFPTEST_SET, 104793841a15SRaja Mani .rts_fixed_rate = WMI_10_4_VDEV_PARAM_RTS_FIXED_RATE, 104893841a15SRaja Mani .vht_sgimask = WMI_10_4_VDEV_PARAM_VHT_SGIMASK, 104993841a15SRaja Mani .vht80_ratemask = WMI_10_4_VDEV_PARAM_VHT80_RATEMASK, 105093841a15SRaja Mani .early_rx_adjust_enable = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_ENABLE, 105193841a15SRaja Mani .early_rx_tgt_bmiss_num = WMI_10_4_VDEV_PARAM_EARLY_RX_TGT_BMISS_NUM, 105293841a15SRaja Mani .early_rx_bmiss_sample_cycle = 105393841a15SRaja Mani WMI_10_4_VDEV_PARAM_EARLY_RX_BMISS_SAMPLE_CYCLE, 105493841a15SRaja Mani .early_rx_slop_step = WMI_10_4_VDEV_PARAM_EARLY_RX_SLOP_STEP, 105593841a15SRaja Mani .early_rx_init_slop = WMI_10_4_VDEV_PARAM_EARLY_RX_INIT_SLOP, 105693841a15SRaja Mani .early_rx_adjust_pause = WMI_10_4_VDEV_PARAM_EARLY_RX_ADJUST_PAUSE, 105793841a15SRaja Mani .proxy_sta = WMI_10_4_VDEV_PARAM_PROXY_STA, 105893841a15SRaja Mani .meru_vc = WMI_10_4_VDEV_PARAM_MERU_VC, 105993841a15SRaja Mani .rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE, 106093841a15SRaja Mani .bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK, 1061973324ffSPedersen, Thomas .inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT, 1062973324ffSPedersen, Thomas .dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT, 106368c295f2SSathishkumar Muruganandam .disable_4addr_src_lrn = WMI_10_4_VDEV_PARAM_DISABLE_4_ADDR_SRC_LRN, 1064059104bfSPradeep Kumar Chitrapu .rtt_responder_role = WMI_10_4_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE, 10654a16fbecSRajkumar Manoharan }; 10664a16fbecSRajkumar Manoharan 1067226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_pdev_param_map = { 1068226a339bSBartosz Markowski .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK, 1069226a339bSBartosz Markowski .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK, 1070226a339bSBartosz Markowski .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G, 1071226a339bSBartosz Markowski .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G, 1072226a339bSBartosz Markowski .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE, 1073226a339bSBartosz Markowski .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE, 1074226a339bSBartosz Markowski .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE, 1075226a339bSBartosz Markowski .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1076226a339bSBartosz Markowski .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE, 1077226a339bSBartosz Markowski .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW, 1078226a339bSBartosz Markowski .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1079226a339bSBartosz Markowski .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH, 1080226a339bSBartosz Markowski .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH, 1081226a339bSBartosz Markowski .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1082226a339bSBartosz Markowski .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE, 1083226a339bSBartosz Markowski .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE, 1084226a339bSBartosz Markowski .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK, 1085226a339bSBartosz Markowski .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI, 1086226a339bSBartosz Markowski .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO, 1087226a339bSBartosz Markowski .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1088226a339bSBartosz Markowski .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1089226a339bSBartosz Markowski .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE, 1090226a339bSBartosz Markowski .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1091226a339bSBartosz Markowski .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE, 1092226a339bSBartosz Markowski .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE, 1093226a339bSBartosz Markowski .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH, 1094226a339bSBartosz Markowski .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1095226a339bSBartosz Markowski .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1096226a339bSBartosz Markowski .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE, 1097226a339bSBartosz Markowski .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1098226a339bSBartosz Markowski .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1099226a339bSBartosz Markowski .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1100226a339bSBartosz Markowski .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1101226a339bSBartosz Markowski .pmf_qos = WMI_PDEV_PARAM_PMF_QOS, 1102226a339bSBartosz Markowski .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE, 1103226a339bSBartosz Markowski .dcs = WMI_PDEV_PARAM_DCS, 1104226a339bSBartosz Markowski .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE, 1105226a339bSBartosz Markowski .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD, 1106226a339bSBartosz Markowski .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD, 1107226a339bSBartosz Markowski .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL, 1108226a339bSBartosz Markowski .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL, 1109226a339bSBartosz Markowski .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN, 1110226a339bSBartosz Markowski .proxy_sta = WMI_PDEV_PARAM_PROXY_STA, 1111226a339bSBartosz Markowski .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG, 1112226a339bSBartosz Markowski .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP, 1113226a339bSBartosz Markowski .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED, 1114226a339bSBartosz Markowski .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED, 1115226a339bSBartosz Markowski .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1116a7bd3e99SPeter Oh .cal_period = WMI_PDEV_PARAM_UNSUPPORTED, 1117d86561ffSRaja Mani .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED, 1118d86561ffSRaja Mani .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1119d86561ffSRaja Mani .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED, 1120d86561ffSRaja Mani .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED, 1121d86561ffSRaja Mani .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1122d86561ffSRaja Mani .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED, 1123d86561ffSRaja Mani .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED, 1124d86561ffSRaja Mani .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1125d86561ffSRaja Mani .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1126d86561ffSRaja Mani .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1127d86561ffSRaja Mani .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1128d86561ffSRaja Mani .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1129d86561ffSRaja Mani .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1130d86561ffSRaja Mani .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, 1131d86561ffSRaja Mani .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED, 1132d86561ffSRaja Mani .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1133d86561ffSRaja Mani .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1134d86561ffSRaja Mani .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1135d86561ffSRaja Mani .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1136d86561ffSRaja Mani .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1137d86561ffSRaja Mani .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1138d86561ffSRaja Mani .en_stats = WMI_PDEV_PARAM_UNSUPPORTED, 1139d86561ffSRaja Mani .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED, 1140d86561ffSRaja Mani .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED, 1141d86561ffSRaja Mani .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1142d86561ffSRaja Mani .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1143d86561ffSRaja Mani .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED, 1144d86561ffSRaja Mani .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED, 1145d86561ffSRaja Mani .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED, 1146d86561ffSRaja Mani .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED, 1147d86561ffSRaja Mani .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED, 1148d86561ffSRaja Mani .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED, 1149d86561ffSRaja Mani .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED, 1150d86561ffSRaja Mani .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED, 1151d86561ffSRaja Mani .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED, 1152d86561ffSRaja Mani .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED, 1153d86561ffSRaja Mani .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1154d86561ffSRaja Mani .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED, 1155d86561ffSRaja Mani .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED, 1156d86561ffSRaja Mani .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED, 1157d86561ffSRaja Mani .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1158d86561ffSRaja Mani .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED, 115939136248SRajkumar Manoharan .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED, 1160226a339bSBartosz Markowski }; 1161226a339bSBartosz Markowski 1162226a339bSBartosz Markowski static struct wmi_pdev_param_map wmi_10x_pdev_param_map = { 1163226a339bSBartosz Markowski .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK, 1164226a339bSBartosz Markowski .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK, 1165226a339bSBartosz Markowski .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G, 1166226a339bSBartosz Markowski .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G, 1167226a339bSBartosz Markowski .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE, 1168226a339bSBartosz Markowski .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE, 1169226a339bSBartosz Markowski .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE, 1170226a339bSBartosz Markowski .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1171226a339bSBartosz Markowski .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE, 1172226a339bSBartosz Markowski .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW, 1173226a339bSBartosz Markowski .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1174226a339bSBartosz Markowski .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, 1175226a339bSBartosz Markowski .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH, 1176226a339bSBartosz Markowski .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1177226a339bSBartosz Markowski .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE, 1178226a339bSBartosz Markowski .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE, 1179226a339bSBartosz Markowski .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK, 1180226a339bSBartosz Markowski .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI, 1181226a339bSBartosz Markowski .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO, 1182226a339bSBartosz Markowski .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1183226a339bSBartosz Markowski .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1184226a339bSBartosz Markowski .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE, 1185226a339bSBartosz Markowski .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1186226a339bSBartosz Markowski .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE, 1187226a339bSBartosz Markowski .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE, 1188226a339bSBartosz Markowski .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED, 1189226a339bSBartosz Markowski .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED, 1190226a339bSBartosz Markowski .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED, 1191226a339bSBartosz Markowski .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED, 1192226a339bSBartosz Markowski .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1193226a339bSBartosz Markowski .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1194226a339bSBartosz Markowski .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1195226a339bSBartosz Markowski .bcnflt_stats_update_period = 1196226a339bSBartosz Markowski WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1197226a339bSBartosz Markowski .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS, 1198ab6258edSMarek Puzyniak .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE, 1199226a339bSBartosz Markowski .dcs = WMI_10X_PDEV_PARAM_DCS, 1200226a339bSBartosz Markowski .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE, 1201226a339bSBartosz Markowski .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD, 1202226a339bSBartosz Markowski .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD, 1203226a339bSBartosz Markowski .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL, 1204226a339bSBartosz Markowski .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL, 1205226a339bSBartosz Markowski .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN, 1206226a339bSBartosz Markowski .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED, 1207226a339bSBartosz Markowski .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED, 1208226a339bSBartosz Markowski .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED, 1209226a339bSBartosz Markowski .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, 1210226a339bSBartosz Markowski .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, 1211226a339bSBartosz Markowski .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, 1212a7bd3e99SPeter Oh .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD, 1213d86561ffSRaja Mani .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED, 1214d86561ffSRaja Mani .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1215d86561ffSRaja Mani .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED, 1216d86561ffSRaja Mani .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED, 1217d86561ffSRaja Mani .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1218d86561ffSRaja Mani .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED, 1219d86561ffSRaja Mani .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED, 1220d86561ffSRaja Mani .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1221d86561ffSRaja Mani .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1222d86561ffSRaja Mani .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1223d86561ffSRaja Mani .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1224d86561ffSRaja Mani .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1225d86561ffSRaja Mani .peer_sta_ps_statechg_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1226d86561ffSRaja Mani .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, 1227d86561ffSRaja Mani .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED, 1228d86561ffSRaja Mani .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1229d86561ffSRaja Mani .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1230d86561ffSRaja Mani .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1231d86561ffSRaja Mani .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1232d86561ffSRaja Mani .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1233d86561ffSRaja Mani .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1234d86561ffSRaja Mani .en_stats = WMI_PDEV_PARAM_UNSUPPORTED, 1235d86561ffSRaja Mani .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED, 1236d86561ffSRaja Mani .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED, 1237d86561ffSRaja Mani .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1238d86561ffSRaja Mani .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1239d86561ffSRaja Mani .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED, 1240d86561ffSRaja Mani .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED, 1241d86561ffSRaja Mani .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED, 1242d86561ffSRaja Mani .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED, 1243d86561ffSRaja Mani .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED, 1244d86561ffSRaja Mani .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED, 1245d86561ffSRaja Mani .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED, 1246d86561ffSRaja Mani .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED, 1247d86561ffSRaja Mani .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED, 1248d86561ffSRaja Mani .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED, 1249d86561ffSRaja Mani .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1250d86561ffSRaja Mani .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED, 1251d86561ffSRaja Mani .pdev_reset = WMI_PDEV_PARAM_UNSUPPORTED, 1252d86561ffSRaja Mani .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED, 1253d86561ffSRaja Mani .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1254d86561ffSRaja Mani .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED, 125539136248SRajkumar Manoharan .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED, 1256226a339bSBartosz Markowski }; 1257226a339bSBartosz Markowski 12584a16fbecSRajkumar Manoharan static struct wmi_pdev_param_map wmi_10_2_4_pdev_param_map = { 12594a16fbecSRajkumar Manoharan .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK, 12604a16fbecSRajkumar Manoharan .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK, 12614a16fbecSRajkumar Manoharan .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G, 12624a16fbecSRajkumar Manoharan .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G, 12634a16fbecSRajkumar Manoharan .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE, 12644a16fbecSRajkumar Manoharan .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE, 12654a16fbecSRajkumar Manoharan .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE, 12664a16fbecSRajkumar Manoharan .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 12674a16fbecSRajkumar Manoharan .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE, 12684a16fbecSRajkumar Manoharan .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW, 12694a16fbecSRajkumar Manoharan .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 12704a16fbecSRajkumar Manoharan .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, 12714a16fbecSRajkumar Manoharan .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH, 12724a16fbecSRajkumar Manoharan .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING, 12734a16fbecSRajkumar Manoharan .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE, 12744a16fbecSRajkumar Manoharan .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE, 12754a16fbecSRajkumar Manoharan .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK, 12764a16fbecSRajkumar Manoharan .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI, 12774a16fbecSRajkumar Manoharan .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO, 12784a16fbecSRajkumar Manoharan .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 12794a16fbecSRajkumar Manoharan .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 12804a16fbecSRajkumar Manoharan .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE, 12814a16fbecSRajkumar Manoharan .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 12824a16fbecSRajkumar Manoharan .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE, 12834a16fbecSRajkumar Manoharan .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE, 12844a16fbecSRajkumar Manoharan .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED, 12854a16fbecSRajkumar Manoharan .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED, 12864a16fbecSRajkumar Manoharan .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED, 12874a16fbecSRajkumar Manoharan .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED, 12884a16fbecSRajkumar Manoharan .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 12894a16fbecSRajkumar Manoharan .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 12904a16fbecSRajkumar Manoharan .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 12914a16fbecSRajkumar Manoharan .bcnflt_stats_update_period = 12924a16fbecSRajkumar Manoharan WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 12934a16fbecSRajkumar Manoharan .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS, 12944a16fbecSRajkumar Manoharan .arp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE, 12954a16fbecSRajkumar Manoharan .dcs = WMI_10X_PDEV_PARAM_DCS, 12964a16fbecSRajkumar Manoharan .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE, 12974a16fbecSRajkumar Manoharan .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD, 12984a16fbecSRajkumar Manoharan .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD, 12994a16fbecSRajkumar Manoharan .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL, 13004a16fbecSRajkumar Manoharan .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL, 13014a16fbecSRajkumar Manoharan .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN, 13024a16fbecSRajkumar Manoharan .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED, 13034a16fbecSRajkumar Manoharan .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED, 13044a16fbecSRajkumar Manoharan .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED, 13054a16fbecSRajkumar Manoharan .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, 13064a16fbecSRajkumar Manoharan .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, 13074a16fbecSRajkumar Manoharan .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, 13084a16fbecSRajkumar Manoharan .cal_period = WMI_10X_PDEV_PARAM_CAL_PERIOD, 1309d86561ffSRaja Mani .aggr_burst = WMI_PDEV_PARAM_UNSUPPORTED, 1310d86561ffSRaja Mani .rx_decap_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1311d86561ffSRaja Mani .smart_antenna_default_antenna = WMI_PDEV_PARAM_UNSUPPORTED, 1312d86561ffSRaja Mani .igmpmld_override = WMI_PDEV_PARAM_UNSUPPORTED, 1313d86561ffSRaja Mani .igmpmld_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1314d86561ffSRaja Mani .antenna_gain = WMI_PDEV_PARAM_UNSUPPORTED, 1315d86561ffSRaja Mani .rx_filter = WMI_PDEV_PARAM_UNSUPPORTED, 1316d86561ffSRaja Mani .set_mcast_to_ucast_tid = WMI_PDEV_PARAM_UNSUPPORTED, 1317d86561ffSRaja Mani .proxy_sta_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1318d86561ffSRaja Mani .set_mcast2ucast_mode = WMI_PDEV_PARAM_UNSUPPORTED, 1319d86561ffSRaja Mani .set_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1320d86561ffSRaja Mani .remove_mcast2ucast_buffer = WMI_PDEV_PARAM_UNSUPPORTED, 1321d70c0d46SMaharaja Kennadyrajan .peer_sta_ps_statechg_enable = 1322d70c0d46SMaharaja Kennadyrajan WMI_10X_PDEV_PARAM_PEER_STA_PS_STATECHG_ENABLE, 1323d86561ffSRaja Mani .igmpmld_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, 1324d86561ffSRaja Mani .block_interbss = WMI_PDEV_PARAM_UNSUPPORTED, 1325d86561ffSRaja Mani .set_disable_reset_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1326d86561ffSRaja Mani .set_msdu_ttl_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1327d86561ffSRaja Mani .set_ppdu_duration_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1328d86561ffSRaja Mani .txbf_sound_period_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1329d86561ffSRaja Mani .set_promisc_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1330d86561ffSRaja Mani .set_burst_mode_cmdid = WMI_PDEV_PARAM_UNSUPPORTED, 1331d86561ffSRaja Mani .en_stats = WMI_PDEV_PARAM_UNSUPPORTED, 1332d86561ffSRaja Mani .mu_group_policy = WMI_PDEV_PARAM_UNSUPPORTED, 1333d86561ffSRaja Mani .noise_detection = WMI_PDEV_PARAM_UNSUPPORTED, 1334d86561ffSRaja Mani .noise_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1335d86561ffSRaja Mani .dpd_enable = WMI_PDEV_PARAM_UNSUPPORTED, 1336d86561ffSRaja Mani .set_mcast_bcast_echo = WMI_PDEV_PARAM_UNSUPPORTED, 1337d86561ffSRaja Mani .atf_strict_sch = WMI_PDEV_PARAM_UNSUPPORTED, 1338d86561ffSRaja Mani .atf_sched_duration = WMI_PDEV_PARAM_UNSUPPORTED, 1339d86561ffSRaja Mani .ant_plzn = WMI_PDEV_PARAM_UNSUPPORTED, 1340d86561ffSRaja Mani .mgmt_retry_limit = WMI_PDEV_PARAM_UNSUPPORTED, 1341d86561ffSRaja Mani .sensitivity_level = WMI_PDEV_PARAM_UNSUPPORTED, 1342d86561ffSRaja Mani .signed_txpower_2g = WMI_PDEV_PARAM_UNSUPPORTED, 1343d86561ffSRaja Mani .signed_txpower_5g = WMI_PDEV_PARAM_UNSUPPORTED, 1344d86561ffSRaja Mani .enable_per_tid_amsdu = WMI_PDEV_PARAM_UNSUPPORTED, 1345d86561ffSRaja Mani .enable_per_tid_ampdu = WMI_PDEV_PARAM_UNSUPPORTED, 1346d86561ffSRaja Mani .cca_threshold = WMI_PDEV_PARAM_UNSUPPORTED, 1347d86561ffSRaja Mani .rts_fixed_rate = WMI_PDEV_PARAM_UNSUPPORTED, 1348db251d7dSMaharaja Kennadyrajan .pdev_reset = WMI_10X_PDEV_PARAM_PDEV_RESET, 1349d86561ffSRaja Mani .wapi_mbssid_offset = WMI_PDEV_PARAM_UNSUPPORTED, 1350d86561ffSRaja Mani .arp_srcaddr = WMI_PDEV_PARAM_UNSUPPORTED, 1351d86561ffSRaja Mani .arp_dstaddr = WMI_PDEV_PARAM_UNSUPPORTED, 135239136248SRajkumar Manoharan .enable_btcoex = WMI_PDEV_PARAM_UNSUPPORTED, 13534a16fbecSRajkumar Manoharan }; 13544a16fbecSRajkumar Manoharan 135524c88f78SMichal Kazior /* firmware 10.2 specific mappings */ 135624c88f78SMichal Kazior static struct wmi_cmd_map wmi_10_2_cmd_map = { 135724c88f78SMichal Kazior .init_cmdid = WMI_10_2_INIT_CMDID, 135824c88f78SMichal Kazior .start_scan_cmdid = WMI_10_2_START_SCAN_CMDID, 135924c88f78SMichal Kazior .stop_scan_cmdid = WMI_10_2_STOP_SCAN_CMDID, 136024c88f78SMichal Kazior .scan_chan_list_cmdid = WMI_10_2_SCAN_CHAN_LIST_CMDID, 136124c88f78SMichal Kazior .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, 136260e1d0fbSCarl Huang .scan_prob_req_oui_cmdid = WMI_CMD_UNSUPPORTED, 136324c88f78SMichal Kazior .pdev_set_regdomain_cmdid = WMI_10_2_PDEV_SET_REGDOMAIN_CMDID, 136424c88f78SMichal Kazior .pdev_set_channel_cmdid = WMI_10_2_PDEV_SET_CHANNEL_CMDID, 136524c88f78SMichal Kazior .pdev_set_param_cmdid = WMI_10_2_PDEV_SET_PARAM_CMDID, 136624c88f78SMichal Kazior .pdev_pktlog_enable_cmdid = WMI_10_2_PDEV_PKTLOG_ENABLE_CMDID, 136724c88f78SMichal Kazior .pdev_pktlog_disable_cmdid = WMI_10_2_PDEV_PKTLOG_DISABLE_CMDID, 136824c88f78SMichal Kazior .pdev_set_wmm_params_cmdid = WMI_10_2_PDEV_SET_WMM_PARAMS_CMDID, 136924c88f78SMichal Kazior .pdev_set_ht_cap_ie_cmdid = WMI_10_2_PDEV_SET_HT_CAP_IE_CMDID, 137024c88f78SMichal Kazior .pdev_set_vht_cap_ie_cmdid = WMI_10_2_PDEV_SET_VHT_CAP_IE_CMDID, 137124c88f78SMichal Kazior .pdev_set_quiet_mode_cmdid = WMI_10_2_PDEV_SET_QUIET_MODE_CMDID, 137224c88f78SMichal Kazior .pdev_green_ap_ps_enable_cmdid = WMI_10_2_PDEV_GREEN_AP_PS_ENABLE_CMDID, 137324c88f78SMichal Kazior .pdev_get_tpc_config_cmdid = WMI_10_2_PDEV_GET_TPC_CONFIG_CMDID, 137424c88f78SMichal Kazior .pdev_set_base_macaddr_cmdid = WMI_10_2_PDEV_SET_BASE_MACADDR_CMDID, 137524c88f78SMichal Kazior .vdev_create_cmdid = WMI_10_2_VDEV_CREATE_CMDID, 137624c88f78SMichal Kazior .vdev_delete_cmdid = WMI_10_2_VDEV_DELETE_CMDID, 137724c88f78SMichal Kazior .vdev_start_request_cmdid = WMI_10_2_VDEV_START_REQUEST_CMDID, 137824c88f78SMichal Kazior .vdev_restart_request_cmdid = WMI_10_2_VDEV_RESTART_REQUEST_CMDID, 137924c88f78SMichal Kazior .vdev_up_cmdid = WMI_10_2_VDEV_UP_CMDID, 138024c88f78SMichal Kazior .vdev_stop_cmdid = WMI_10_2_VDEV_STOP_CMDID, 138124c88f78SMichal Kazior .vdev_down_cmdid = WMI_10_2_VDEV_DOWN_CMDID, 138224c88f78SMichal Kazior .vdev_set_param_cmdid = WMI_10_2_VDEV_SET_PARAM_CMDID, 138324c88f78SMichal Kazior .vdev_install_key_cmdid = WMI_10_2_VDEV_INSTALL_KEY_CMDID, 138424c88f78SMichal Kazior .peer_create_cmdid = WMI_10_2_PEER_CREATE_CMDID, 138524c88f78SMichal Kazior .peer_delete_cmdid = WMI_10_2_PEER_DELETE_CMDID, 138624c88f78SMichal Kazior .peer_flush_tids_cmdid = WMI_10_2_PEER_FLUSH_TIDS_CMDID, 138724c88f78SMichal Kazior .peer_set_param_cmdid = WMI_10_2_PEER_SET_PARAM_CMDID, 138824c88f78SMichal Kazior .peer_assoc_cmdid = WMI_10_2_PEER_ASSOC_CMDID, 138924c88f78SMichal Kazior .peer_add_wds_entry_cmdid = WMI_10_2_PEER_ADD_WDS_ENTRY_CMDID, 139024c88f78SMichal Kazior .peer_remove_wds_entry_cmdid = WMI_10_2_PEER_REMOVE_WDS_ENTRY_CMDID, 139124c88f78SMichal Kazior .peer_mcast_group_cmdid = WMI_10_2_PEER_MCAST_GROUP_CMDID, 139224c88f78SMichal Kazior .bcn_tx_cmdid = WMI_10_2_BCN_TX_CMDID, 139324c88f78SMichal Kazior .pdev_send_bcn_cmdid = WMI_10_2_PDEV_SEND_BCN_CMDID, 139424c88f78SMichal Kazior .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 139524c88f78SMichal Kazior .bcn_filter_rx_cmdid = WMI_10_2_BCN_FILTER_RX_CMDID, 139624c88f78SMichal Kazior .prb_req_filter_rx_cmdid = WMI_10_2_PRB_REQ_FILTER_RX_CMDID, 139724c88f78SMichal Kazior .mgmt_tx_cmdid = WMI_10_2_MGMT_TX_CMDID, 139824c88f78SMichal Kazior .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, 139924c88f78SMichal Kazior .addba_clear_resp_cmdid = WMI_10_2_ADDBA_CLEAR_RESP_CMDID, 140024c88f78SMichal Kazior .addba_send_cmdid = WMI_10_2_ADDBA_SEND_CMDID, 140124c88f78SMichal Kazior .addba_status_cmdid = WMI_10_2_ADDBA_STATUS_CMDID, 140224c88f78SMichal Kazior .delba_send_cmdid = WMI_10_2_DELBA_SEND_CMDID, 140324c88f78SMichal Kazior .addba_set_resp_cmdid = WMI_10_2_ADDBA_SET_RESP_CMDID, 140424c88f78SMichal Kazior .send_singleamsdu_cmdid = WMI_10_2_SEND_SINGLEAMSDU_CMDID, 140524c88f78SMichal Kazior .sta_powersave_mode_cmdid = WMI_10_2_STA_POWERSAVE_MODE_CMDID, 140624c88f78SMichal Kazior .sta_powersave_param_cmdid = WMI_10_2_STA_POWERSAVE_PARAM_CMDID, 140724c88f78SMichal Kazior .sta_mimo_ps_mode_cmdid = WMI_10_2_STA_MIMO_PS_MODE_CMDID, 140824c88f78SMichal Kazior .pdev_dfs_enable_cmdid = WMI_10_2_PDEV_DFS_ENABLE_CMDID, 140924c88f78SMichal Kazior .pdev_dfs_disable_cmdid = WMI_10_2_PDEV_DFS_DISABLE_CMDID, 141024c88f78SMichal Kazior .roam_scan_mode = WMI_10_2_ROAM_SCAN_MODE, 141124c88f78SMichal Kazior .roam_scan_rssi_threshold = WMI_10_2_ROAM_SCAN_RSSI_THRESHOLD, 141224c88f78SMichal Kazior .roam_scan_period = WMI_10_2_ROAM_SCAN_PERIOD, 141324c88f78SMichal Kazior .roam_scan_rssi_change_threshold = 141424c88f78SMichal Kazior WMI_10_2_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, 141524c88f78SMichal Kazior .roam_ap_profile = WMI_10_2_ROAM_AP_PROFILE, 141624c88f78SMichal Kazior .ofl_scan_add_ap_profile = WMI_10_2_OFL_SCAN_ADD_AP_PROFILE, 141724c88f78SMichal Kazior .ofl_scan_remove_ap_profile = WMI_10_2_OFL_SCAN_REMOVE_AP_PROFILE, 141824c88f78SMichal Kazior .ofl_scan_period = WMI_10_2_OFL_SCAN_PERIOD, 141924c88f78SMichal Kazior .p2p_dev_set_device_info = WMI_10_2_P2P_DEV_SET_DEVICE_INFO, 142024c88f78SMichal Kazior .p2p_dev_set_discoverability = WMI_10_2_P2P_DEV_SET_DISCOVERABILITY, 142124c88f78SMichal Kazior .p2p_go_set_beacon_ie = WMI_10_2_P2P_GO_SET_BEACON_IE, 142224c88f78SMichal Kazior .p2p_go_set_probe_resp_ie = WMI_10_2_P2P_GO_SET_PROBE_RESP_IE, 142324c88f78SMichal Kazior .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, 142424c88f78SMichal Kazior .ap_ps_peer_param_cmdid = WMI_10_2_AP_PS_PEER_PARAM_CMDID, 142524c88f78SMichal Kazior .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, 142624c88f78SMichal Kazior .peer_rate_retry_sched_cmdid = WMI_10_2_PEER_RATE_RETRY_SCHED_CMDID, 142724c88f78SMichal Kazior .wlan_profile_trigger_cmdid = WMI_10_2_WLAN_PROFILE_TRIGGER_CMDID, 142824c88f78SMichal Kazior .wlan_profile_set_hist_intvl_cmdid = 142924c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_SET_HIST_INTVL_CMDID, 143024c88f78SMichal Kazior .wlan_profile_get_profile_data_cmdid = 143124c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, 143224c88f78SMichal Kazior .wlan_profile_enable_profile_id_cmdid = 143324c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, 143424c88f78SMichal Kazior .wlan_profile_list_profile_id_cmdid = 143524c88f78SMichal Kazior WMI_10_2_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, 143624c88f78SMichal Kazior .pdev_suspend_cmdid = WMI_10_2_PDEV_SUSPEND_CMDID, 143724c88f78SMichal Kazior .pdev_resume_cmdid = WMI_10_2_PDEV_RESUME_CMDID, 143824c88f78SMichal Kazior .add_bcn_filter_cmdid = WMI_10_2_ADD_BCN_FILTER_CMDID, 143924c88f78SMichal Kazior .rmv_bcn_filter_cmdid = WMI_10_2_RMV_BCN_FILTER_CMDID, 144024c88f78SMichal Kazior .wow_add_wake_pattern_cmdid = WMI_10_2_WOW_ADD_WAKE_PATTERN_CMDID, 144124c88f78SMichal Kazior .wow_del_wake_pattern_cmdid = WMI_10_2_WOW_DEL_WAKE_PATTERN_CMDID, 144224c88f78SMichal Kazior .wow_enable_disable_wake_event_cmdid = 144324c88f78SMichal Kazior WMI_10_2_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, 144424c88f78SMichal Kazior .wow_enable_cmdid = WMI_10_2_WOW_ENABLE_CMDID, 144524c88f78SMichal Kazior .wow_hostwakeup_from_sleep_cmdid = 144624c88f78SMichal Kazior WMI_10_2_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, 144724c88f78SMichal Kazior .rtt_measreq_cmdid = WMI_10_2_RTT_MEASREQ_CMDID, 144824c88f78SMichal Kazior .rtt_tsf_cmdid = WMI_10_2_RTT_TSF_CMDID, 144924c88f78SMichal Kazior .vdev_spectral_scan_configure_cmdid = 145024c88f78SMichal Kazior WMI_10_2_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, 145124c88f78SMichal Kazior .vdev_spectral_scan_enable_cmdid = 145224c88f78SMichal Kazior WMI_10_2_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, 145324c88f78SMichal Kazior .request_stats_cmdid = WMI_10_2_REQUEST_STATS_CMDID, 145424c88f78SMichal Kazior .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, 145524c88f78SMichal Kazior .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, 145624c88f78SMichal Kazior .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, 145724c88f78SMichal Kazior .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, 145824c88f78SMichal Kazior .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, 145924c88f78SMichal Kazior .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, 146024c88f78SMichal Kazior .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, 146124c88f78SMichal Kazior .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, 146224c88f78SMichal Kazior .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, 146324c88f78SMichal Kazior .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, 146424c88f78SMichal Kazior .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, 146524c88f78SMichal Kazior .echo_cmdid = WMI_10_2_ECHO_CMDID, 146624c88f78SMichal Kazior .pdev_utf_cmdid = WMI_10_2_PDEV_UTF_CMDID, 146724c88f78SMichal Kazior .dbglog_cfg_cmdid = WMI_10_2_DBGLOG_CFG_CMDID, 146824c88f78SMichal Kazior .pdev_qvit_cmdid = WMI_10_2_PDEV_QVIT_CMDID, 146924c88f78SMichal Kazior .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, 147024c88f78SMichal Kazior .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 147124c88f78SMichal Kazior .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 147224c88f78SMichal Kazior .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, 147324c88f78SMichal Kazior .gpio_config_cmdid = WMI_10_2_GPIO_CONFIG_CMDID, 147424c88f78SMichal Kazior .gpio_output_cmdid = WMI_10_2_GPIO_OUTPUT_CMDID, 1475a57a6a27SRajkumar Manoharan .pdev_get_temperature_cmdid = WMI_CMD_UNSUPPORTED, 147662f77f09SMaharaja .pdev_enable_adaptive_cca_cmdid = WMI_CMD_UNSUPPORTED, 1477772b4aeeSRaja Mani .scan_update_request_cmdid = WMI_CMD_UNSUPPORTED, 1478772b4aeeSRaja Mani .vdev_standby_response_cmdid = WMI_CMD_UNSUPPORTED, 1479772b4aeeSRaja Mani .vdev_resume_response_cmdid = WMI_CMD_UNSUPPORTED, 1480772b4aeeSRaja Mani .wlan_peer_caching_add_peer_cmdid = WMI_CMD_UNSUPPORTED, 1481772b4aeeSRaja Mani .wlan_peer_caching_evict_peer_cmdid = WMI_CMD_UNSUPPORTED, 1482772b4aeeSRaja Mani .wlan_peer_caching_restore_peer_cmdid = WMI_CMD_UNSUPPORTED, 1483772b4aeeSRaja Mani .wlan_peer_caching_print_all_peers_info_cmdid = WMI_CMD_UNSUPPORTED, 1484772b4aeeSRaja Mani .peer_update_wds_entry_cmdid = WMI_CMD_UNSUPPORTED, 1485772b4aeeSRaja Mani .peer_add_proxy_sta_entry_cmdid = WMI_CMD_UNSUPPORTED, 1486772b4aeeSRaja Mani .rtt_keepalive_cmdid = WMI_CMD_UNSUPPORTED, 1487772b4aeeSRaja Mani .oem_req_cmdid = WMI_CMD_UNSUPPORTED, 1488772b4aeeSRaja Mani .nan_cmdid = WMI_CMD_UNSUPPORTED, 1489772b4aeeSRaja Mani .vdev_ratemask_cmdid = WMI_CMD_UNSUPPORTED, 1490772b4aeeSRaja Mani .qboost_cfg_cmdid = WMI_CMD_UNSUPPORTED, 1491772b4aeeSRaja Mani .pdev_smart_ant_enable_cmdid = WMI_CMD_UNSUPPORTED, 1492772b4aeeSRaja Mani .pdev_smart_ant_set_rx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 1493772b4aeeSRaja Mani .peer_smart_ant_set_tx_antenna_cmdid = WMI_CMD_UNSUPPORTED, 1494772b4aeeSRaja Mani .peer_smart_ant_set_train_info_cmdid = WMI_CMD_UNSUPPORTED, 1495772b4aeeSRaja Mani .peer_smart_ant_set_node_config_ops_cmdid = WMI_CMD_UNSUPPORTED, 1496772b4aeeSRaja Mani .pdev_set_antenna_switch_table_cmdid = WMI_CMD_UNSUPPORTED, 1497772b4aeeSRaja Mani .pdev_set_ctl_table_cmdid = WMI_CMD_UNSUPPORTED, 1498772b4aeeSRaja Mani .pdev_set_mimogain_table_cmdid = WMI_CMD_UNSUPPORTED, 1499772b4aeeSRaja Mani .pdev_ratepwr_table_cmdid = WMI_CMD_UNSUPPORTED, 1500772b4aeeSRaja Mani .pdev_ratepwr_chainmsk_table_cmdid = WMI_CMD_UNSUPPORTED, 1501772b4aeeSRaja Mani .pdev_fips_cmdid = WMI_CMD_UNSUPPORTED, 1502772b4aeeSRaja Mani .tt_set_conf_cmdid = WMI_CMD_UNSUPPORTED, 1503772b4aeeSRaja Mani .fwtest_cmdid = WMI_CMD_UNSUPPORTED, 1504772b4aeeSRaja Mani .vdev_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 1505772b4aeeSRaja Mani .peer_atf_request_cmdid = WMI_CMD_UNSUPPORTED, 1506772b4aeeSRaja Mani .pdev_get_ani_cck_config_cmdid = WMI_CMD_UNSUPPORTED, 1507772b4aeeSRaja Mani .pdev_get_ani_ofdm_config_cmdid = WMI_CMD_UNSUPPORTED, 1508772b4aeeSRaja Mani .pdev_reserve_ast_entry_cmdid = WMI_CMD_UNSUPPORTED, 1509bc64d052SMaharaja Kennadyrajan .pdev_get_tpc_table_cmdid = WMI_CMD_UNSUPPORTED, 15106f6eb1bcSSriram R .radar_found_cmdid = WMI_CMD_UNSUPPORTED, 151124c88f78SMichal Kazior }; 151224c88f78SMichal Kazior 1513d86561ffSRaja Mani static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = { 1514d86561ffSRaja Mani .tx_chain_mask = WMI_10_4_PDEV_PARAM_TX_CHAIN_MASK, 1515d86561ffSRaja Mani .rx_chain_mask = WMI_10_4_PDEV_PARAM_RX_CHAIN_MASK, 1516d86561ffSRaja Mani .txpower_limit2g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT2G, 1517d86561ffSRaja Mani .txpower_limit5g = WMI_10_4_PDEV_PARAM_TXPOWER_LIMIT5G, 1518d86561ffSRaja Mani .txpower_scale = WMI_10_4_PDEV_PARAM_TXPOWER_SCALE, 1519d86561ffSRaja Mani .beacon_gen_mode = WMI_10_4_PDEV_PARAM_BEACON_GEN_MODE, 1520d86561ffSRaja Mani .beacon_tx_mode = WMI_10_4_PDEV_PARAM_BEACON_TX_MODE, 1521d86561ffSRaja Mani .resmgr_offchan_mode = WMI_10_4_PDEV_PARAM_RESMGR_OFFCHAN_MODE, 1522d86561ffSRaja Mani .protection_mode = WMI_10_4_PDEV_PARAM_PROTECTION_MODE, 1523d86561ffSRaja Mani .dynamic_bw = WMI_10_4_PDEV_PARAM_DYNAMIC_BW, 1524d86561ffSRaja Mani .non_agg_sw_retry_th = WMI_10_4_PDEV_PARAM_NON_AGG_SW_RETRY_TH, 1525d86561ffSRaja Mani .agg_sw_retry_th = WMI_10_4_PDEV_PARAM_AGG_SW_RETRY_TH, 1526d86561ffSRaja Mani .sta_kickout_th = WMI_10_4_PDEV_PARAM_STA_KICKOUT_TH, 1527d86561ffSRaja Mani .ac_aggrsize_scaling = WMI_10_4_PDEV_PARAM_AC_AGGRSIZE_SCALING, 1528d86561ffSRaja Mani .ltr_enable = WMI_10_4_PDEV_PARAM_LTR_ENABLE, 1529d86561ffSRaja Mani .ltr_ac_latency_be = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BE, 1530d86561ffSRaja Mani .ltr_ac_latency_bk = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_BK, 1531d86561ffSRaja Mani .ltr_ac_latency_vi = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VI, 1532d86561ffSRaja Mani .ltr_ac_latency_vo = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_VO, 1533d86561ffSRaja Mani .ltr_ac_latency_timeout = WMI_10_4_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, 1534d86561ffSRaja Mani .ltr_sleep_override = WMI_10_4_PDEV_PARAM_LTR_SLEEP_OVERRIDE, 1535d86561ffSRaja Mani .ltr_rx_override = WMI_10_4_PDEV_PARAM_LTR_RX_OVERRIDE, 1536d86561ffSRaja Mani .ltr_tx_activity_timeout = WMI_10_4_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, 1537d86561ffSRaja Mani .l1ss_enable = WMI_10_4_PDEV_PARAM_L1SS_ENABLE, 1538d86561ffSRaja Mani .dsleep_enable = WMI_10_4_PDEV_PARAM_DSLEEP_ENABLE, 1539d86561ffSRaja Mani .pcielp_txbuf_flush = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_FLUSH, 1540d86561ffSRaja Mani .pcielp_txbuf_watermark = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_WATERMARK, 1541d86561ffSRaja Mani .pcielp_txbuf_tmo_en = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, 1542d86561ffSRaja Mani .pcielp_txbuf_tmo_value = WMI_10_4_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE, 1543d86561ffSRaja Mani .pdev_stats_update_period = 1544d86561ffSRaja Mani WMI_10_4_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, 1545d86561ffSRaja Mani .vdev_stats_update_period = 1546d86561ffSRaja Mani WMI_10_4_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, 1547d86561ffSRaja Mani .peer_stats_update_period = 1548d86561ffSRaja Mani WMI_10_4_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, 1549d86561ffSRaja Mani .bcnflt_stats_update_period = 1550d86561ffSRaja Mani WMI_10_4_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, 1551d86561ffSRaja Mani .pmf_qos = WMI_10_4_PDEV_PARAM_PMF_QOS, 1552d86561ffSRaja Mani .arp_ac_override = WMI_10_4_PDEV_PARAM_ARP_AC_OVERRIDE, 1553d86561ffSRaja Mani .dcs = WMI_10_4_PDEV_PARAM_DCS, 1554d86561ffSRaja Mani .ani_enable = WMI_10_4_PDEV_PARAM_ANI_ENABLE, 1555d86561ffSRaja Mani .ani_poll_period = WMI_10_4_PDEV_PARAM_ANI_POLL_PERIOD, 1556d86561ffSRaja Mani .ani_listen_period = WMI_10_4_PDEV_PARAM_ANI_LISTEN_PERIOD, 1557d86561ffSRaja Mani .ani_ofdm_level = WMI_10_4_PDEV_PARAM_ANI_OFDM_LEVEL, 1558d86561ffSRaja Mani .ani_cck_level = WMI_10_4_PDEV_PARAM_ANI_CCK_LEVEL, 1559d86561ffSRaja Mani .dyntxchain = WMI_10_4_PDEV_PARAM_DYNTXCHAIN, 1560d86561ffSRaja Mani .proxy_sta = WMI_10_4_PDEV_PARAM_PROXY_STA, 1561d86561ffSRaja Mani .idle_ps_config = WMI_10_4_PDEV_PARAM_IDLE_PS_CONFIG, 1562d86561ffSRaja Mani .power_gating_sleep = WMI_10_4_PDEV_PARAM_POWER_GATING_SLEEP, 1563d86561ffSRaja Mani .fast_channel_reset = WMI_10_4_PDEV_PARAM_FAST_CHANNEL_RESET, 1564d86561ffSRaja Mani .burst_dur = WMI_10_4_PDEV_PARAM_BURST_DUR, 1565d86561ffSRaja Mani .burst_enable = WMI_10_4_PDEV_PARAM_BURST_ENABLE, 1566d86561ffSRaja Mani .cal_period = WMI_10_4_PDEV_PARAM_CAL_PERIOD, 1567d86561ffSRaja Mani .aggr_burst = WMI_10_4_PDEV_PARAM_AGGR_BURST, 1568d86561ffSRaja Mani .rx_decap_mode = WMI_10_4_PDEV_PARAM_RX_DECAP_MODE, 1569d86561ffSRaja Mani .smart_antenna_default_antenna = 1570d86561ffSRaja Mani WMI_10_4_PDEV_PARAM_SMART_ANTENNA_DEFAULT_ANTENNA, 1571d86561ffSRaja Mani .igmpmld_override = WMI_10_4_PDEV_PARAM_IGMPMLD_OVERRIDE, 1572d86561ffSRaja Mani .igmpmld_tid = WMI_10_4_PDEV_PARAM_IGMPMLD_TID, 1573d86561ffSRaja Mani .antenna_gain = WMI_10_4_PDEV_PARAM_ANTENNA_GAIN, 1574d86561ffSRaja Mani .rx_filter = WMI_10_4_PDEV_PARAM_RX_FILTER, 1575d86561ffSRaja Mani .set_mcast_to_ucast_tid = WMI_10_4_PDEV_SET_MCAST_TO_UCAST_TID, 1576d86561ffSRaja Mani .proxy_sta_mode = WMI_10_4_PDEV_PARAM_PROXY_STA_MODE, 1577d86561ffSRaja Mani .set_mcast2ucast_mode = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_MODE, 1578d86561ffSRaja Mani .set_mcast2ucast_buffer = WMI_10_4_PDEV_PARAM_SET_MCAST2UCAST_BUFFER, 1579d86561ffSRaja Mani .remove_mcast2ucast_buffer = 1580d86561ffSRaja Mani WMI_10_4_PDEV_PARAM_REMOVE_MCAST2UCAST_BUFFER, 1581d86561ffSRaja Mani .peer_sta_ps_statechg_enable = 1582d86561ffSRaja Mani WMI_10_4_PDEV_PEER_STA_PS_STATECHG_ENABLE, 1583d86561ffSRaja Mani .igmpmld_ac_override = WMI_10_4_PDEV_PARAM_IGMPMLD_AC_OVERRIDE, 1584d86561ffSRaja Mani .block_interbss = WMI_10_4_PDEV_PARAM_BLOCK_INTERBSS, 1585d86561ffSRaja Mani .set_disable_reset_cmdid = WMI_10_4_PDEV_PARAM_SET_DISABLE_RESET_CMDID, 1586d86561ffSRaja Mani .set_msdu_ttl_cmdid = WMI_10_4_PDEV_PARAM_SET_MSDU_TTL_CMDID, 1587d86561ffSRaja Mani .set_ppdu_duration_cmdid = WMI_10_4_PDEV_PARAM_SET_PPDU_DURATION_CMDID, 1588d86561ffSRaja Mani .txbf_sound_period_cmdid = WMI_10_4_PDEV_PARAM_TXBF_SOUND_PERIOD_CMDID, 1589d86561ffSRaja Mani .set_promisc_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_PROMISC_MODE_CMDID, 1590d86561ffSRaja Mani .set_burst_mode_cmdid = WMI_10_4_PDEV_PARAM_SET_BURST_MODE_CMDID, 1591d86561ffSRaja Mani .en_stats = WMI_10_4_PDEV_PARAM_EN_STATS, 1592d86561ffSRaja Mani .mu_group_policy = WMI_10_4_PDEV_PARAM_MU_GROUP_POLICY, 1593d86561ffSRaja Mani .noise_detection = WMI_10_4_PDEV_PARAM_NOISE_DETECTION, 1594d86561ffSRaja Mani .noise_threshold = WMI_10_4_PDEV_PARAM_NOISE_THRESHOLD, 1595d86561ffSRaja Mani .dpd_enable = WMI_10_4_PDEV_PARAM_DPD_ENABLE, 1596d86561ffSRaja Mani .set_mcast_bcast_echo = WMI_10_4_PDEV_PARAM_SET_MCAST_BCAST_ECHO, 1597d86561ffSRaja Mani .atf_strict_sch = WMI_10_4_PDEV_PARAM_ATF_STRICT_SCH, 1598d86561ffSRaja Mani .atf_sched_duration = WMI_10_4_PDEV_PARAM_ATF_SCHED_DURATION, 1599d86561ffSRaja Mani .ant_plzn = WMI_10_4_PDEV_PARAM_ANT_PLZN, 1600d86561ffSRaja Mani .mgmt_retry_limit = WMI_10_4_PDEV_PARAM_MGMT_RETRY_LIMIT, 1601d86561ffSRaja Mani .sensitivity_level = WMI_10_4_PDEV_PARAM_SENSITIVITY_LEVEL, 1602d86561ffSRaja Mani .signed_txpower_2g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_2G, 1603d86561ffSRaja Mani .signed_txpower_5g = WMI_10_4_PDEV_PARAM_SIGNED_TXPOWER_5G, 1604d86561ffSRaja Mani .enable_per_tid_amsdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMSDU, 1605d86561ffSRaja Mani .enable_per_tid_ampdu = WMI_10_4_PDEV_PARAM_ENABLE_PER_TID_AMPDU, 1606d86561ffSRaja Mani .cca_threshold = WMI_10_4_PDEV_PARAM_CCA_THRESHOLD, 1607d86561ffSRaja Mani .rts_fixed_rate = WMI_10_4_PDEV_PARAM_RTS_FIXED_RATE, 1608d86561ffSRaja Mani .pdev_reset = WMI_10_4_PDEV_PARAM_PDEV_RESET, 1609d86561ffSRaja Mani .wapi_mbssid_offset = WMI_10_4_PDEV_PARAM_WAPI_MBSSID_OFFSET, 1610d86561ffSRaja Mani .arp_srcaddr = WMI_10_4_PDEV_PARAM_ARP_SRCADDR, 1611d86561ffSRaja Mani .arp_dstaddr = WMI_10_4_PDEV_PARAM_ARP_DSTADDR, 161239136248SRajkumar Manoharan .enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX, 1613d86561ffSRaja Mani }; 1614d86561ffSRaja Mani 16157d94f862SAbhishek Ambure static const u8 wmi_key_cipher_suites[] = { 16167d94f862SAbhishek Ambure [WMI_CIPHER_NONE] = WMI_CIPHER_NONE, 16177d94f862SAbhishek Ambure [WMI_CIPHER_WEP] = WMI_CIPHER_WEP, 16187d94f862SAbhishek Ambure [WMI_CIPHER_TKIP] = WMI_CIPHER_TKIP, 16197d94f862SAbhishek Ambure [WMI_CIPHER_AES_OCB] = WMI_CIPHER_AES_OCB, 16207d94f862SAbhishek Ambure [WMI_CIPHER_AES_CCM] = WMI_CIPHER_AES_CCM, 16217d94f862SAbhishek Ambure [WMI_CIPHER_WAPI] = WMI_CIPHER_WAPI, 16227d94f862SAbhishek Ambure [WMI_CIPHER_CKIP] = WMI_CIPHER_CKIP, 16237d94f862SAbhishek Ambure [WMI_CIPHER_AES_CMAC] = WMI_CIPHER_AES_CMAC, 16247d94f862SAbhishek Ambure [WMI_CIPHER_AES_GCM] = WMI_CIPHER_AES_GCM, 16257d94f862SAbhishek Ambure }; 16267d94f862SAbhishek Ambure 16277d94f862SAbhishek Ambure static const u8 wmi_tlv_key_cipher_suites[] = { 16287d94f862SAbhishek Ambure [WMI_CIPHER_NONE] = WMI_TLV_CIPHER_NONE, 16297d94f862SAbhishek Ambure [WMI_CIPHER_WEP] = WMI_TLV_CIPHER_WEP, 16307d94f862SAbhishek Ambure [WMI_CIPHER_TKIP] = WMI_TLV_CIPHER_TKIP, 16317d94f862SAbhishek Ambure [WMI_CIPHER_AES_OCB] = WMI_TLV_CIPHER_AES_OCB, 16327d94f862SAbhishek Ambure [WMI_CIPHER_AES_CCM] = WMI_TLV_CIPHER_AES_CCM, 16337d94f862SAbhishek Ambure [WMI_CIPHER_WAPI] = WMI_TLV_CIPHER_WAPI, 16347d94f862SAbhishek Ambure [WMI_CIPHER_CKIP] = WMI_TLV_CIPHER_CKIP, 16357d94f862SAbhishek Ambure [WMI_CIPHER_AES_CMAC] = WMI_TLV_CIPHER_AES_CMAC, 16367d94f862SAbhishek Ambure [WMI_CIPHER_AES_GCM] = WMI_TLV_CIPHER_AES_GCM, 16377d94f862SAbhishek Ambure }; 16387d94f862SAbhishek Ambure 16393fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_peer_flags_map = { 16403fab30f7STamizh chelvam .auth = WMI_PEER_AUTH, 16413fab30f7STamizh chelvam .qos = WMI_PEER_QOS, 16423fab30f7STamizh chelvam .need_ptk_4_way = WMI_PEER_NEED_PTK_4_WAY, 16433fab30f7STamizh chelvam .need_gtk_2_way = WMI_PEER_NEED_GTK_2_WAY, 16443fab30f7STamizh chelvam .apsd = WMI_PEER_APSD, 16453fab30f7STamizh chelvam .ht = WMI_PEER_HT, 16463fab30f7STamizh chelvam .bw40 = WMI_PEER_40MHZ, 16473fab30f7STamizh chelvam .stbc = WMI_PEER_STBC, 16483fab30f7STamizh chelvam .ldbc = WMI_PEER_LDPC, 16493fab30f7STamizh chelvam .dyn_mimops = WMI_PEER_DYN_MIMOPS, 16503fab30f7STamizh chelvam .static_mimops = WMI_PEER_STATIC_MIMOPS, 16513fab30f7STamizh chelvam .spatial_mux = WMI_PEER_SPATIAL_MUX, 16523fab30f7STamizh chelvam .vht = WMI_PEER_VHT, 16533fab30f7STamizh chelvam .bw80 = WMI_PEER_80MHZ, 16543fab30f7STamizh chelvam .vht_2g = WMI_PEER_VHT_2G, 16553fab30f7STamizh chelvam .pmf = WMI_PEER_PMF, 1656bc1efd73SSebastian Gottschall .bw160 = WMI_PEER_160MHZ, 16573fab30f7STamizh chelvam }; 16583fab30f7STamizh chelvam 16593fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_10x_peer_flags_map = { 16603fab30f7STamizh chelvam .auth = WMI_10X_PEER_AUTH, 16613fab30f7STamizh chelvam .qos = WMI_10X_PEER_QOS, 16623fab30f7STamizh chelvam .need_ptk_4_way = WMI_10X_PEER_NEED_PTK_4_WAY, 16633fab30f7STamizh chelvam .need_gtk_2_way = WMI_10X_PEER_NEED_GTK_2_WAY, 16643fab30f7STamizh chelvam .apsd = WMI_10X_PEER_APSD, 16653fab30f7STamizh chelvam .ht = WMI_10X_PEER_HT, 16663fab30f7STamizh chelvam .bw40 = WMI_10X_PEER_40MHZ, 16673fab30f7STamizh chelvam .stbc = WMI_10X_PEER_STBC, 16683fab30f7STamizh chelvam .ldbc = WMI_10X_PEER_LDPC, 16693fab30f7STamizh chelvam .dyn_mimops = WMI_10X_PEER_DYN_MIMOPS, 16703fab30f7STamizh chelvam .static_mimops = WMI_10X_PEER_STATIC_MIMOPS, 16713fab30f7STamizh chelvam .spatial_mux = WMI_10X_PEER_SPATIAL_MUX, 16723fab30f7STamizh chelvam .vht = WMI_10X_PEER_VHT, 16733fab30f7STamizh chelvam .bw80 = WMI_10X_PEER_80MHZ, 1674bc1efd73SSebastian Gottschall .bw160 = WMI_10X_PEER_160MHZ, 16753fab30f7STamizh chelvam }; 16763fab30f7STamizh chelvam 16773fab30f7STamizh chelvam static const struct wmi_peer_flags_map wmi_10_2_peer_flags_map = { 16783fab30f7STamizh chelvam .auth = WMI_10_2_PEER_AUTH, 16793fab30f7STamizh chelvam .qos = WMI_10_2_PEER_QOS, 16803fab30f7STamizh chelvam .need_ptk_4_way = WMI_10_2_PEER_NEED_PTK_4_WAY, 16813fab30f7STamizh chelvam .need_gtk_2_way = WMI_10_2_PEER_NEED_GTK_2_WAY, 16823fab30f7STamizh chelvam .apsd = WMI_10_2_PEER_APSD, 16833fab30f7STamizh chelvam .ht = WMI_10_2_PEER_HT, 16843fab30f7STamizh chelvam .bw40 = WMI_10_2_PEER_40MHZ, 16853fab30f7STamizh chelvam .stbc = WMI_10_2_PEER_STBC, 16863fab30f7STamizh chelvam .ldbc = WMI_10_2_PEER_LDPC, 16873fab30f7STamizh chelvam .dyn_mimops = WMI_10_2_PEER_DYN_MIMOPS, 16883fab30f7STamizh chelvam .static_mimops = WMI_10_2_PEER_STATIC_MIMOPS, 16893fab30f7STamizh chelvam .spatial_mux = WMI_10_2_PEER_SPATIAL_MUX, 16903fab30f7STamizh chelvam .vht = WMI_10_2_PEER_VHT, 16913fab30f7STamizh chelvam .bw80 = WMI_10_2_PEER_80MHZ, 16923fab30f7STamizh chelvam .vht_2g = WMI_10_2_PEER_VHT_2G, 16933fab30f7STamizh chelvam .pmf = WMI_10_2_PEER_PMF, 1694bc1efd73SSebastian Gottschall .bw160 = WMI_10_2_PEER_160MHZ, 16953fab30f7STamizh chelvam }; 16963fab30f7STamizh chelvam 16970226d602SMichal Kazior void ath10k_wmi_put_wmi_channel(struct wmi_channel *ch, 16982d66721cSMichal Kazior const struct wmi_channel_arg *arg) 16992d66721cSMichal Kazior { 17002d66721cSMichal Kazior u32 flags = 0; 17012d66721cSMichal Kazior 17022d66721cSMichal Kazior memset(ch, 0, sizeof(*ch)); 17032d66721cSMichal Kazior 17042d66721cSMichal Kazior if (arg->passive) 17052d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_PASSIVE; 17062d66721cSMichal Kazior if (arg->allow_ibss) 17072d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_ADHOC_ALLOWED; 17082d66721cSMichal Kazior if (arg->allow_ht) 17092d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_ALLOW_HT; 17102d66721cSMichal Kazior if (arg->allow_vht) 17112d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_ALLOW_VHT; 17122d66721cSMichal Kazior if (arg->ht40plus) 17132d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_HT40_PLUS; 17142d66721cSMichal Kazior if (arg->chan_radar) 17152d66721cSMichal Kazior flags |= WMI_CHAN_FLAG_DFS; 17162d66721cSMichal Kazior 17172d66721cSMichal Kazior ch->mhz = __cpu_to_le32(arg->freq); 17182d66721cSMichal Kazior ch->band_center_freq1 = __cpu_to_le32(arg->band_center_freq1); 1719bc1efd73SSebastian Gottschall if (arg->mode == MODE_11AC_VHT80_80) 1720bc1efd73SSebastian Gottschall ch->band_center_freq2 = __cpu_to_le32(arg->band_center_freq2); 1721bc1efd73SSebastian Gottschall else 17222d66721cSMichal Kazior ch->band_center_freq2 = 0; 17232d66721cSMichal Kazior ch->min_power = arg->min_power; 17242d66721cSMichal Kazior ch->max_power = arg->max_power; 17252d66721cSMichal Kazior ch->reg_power = arg->max_reg_power; 17262d66721cSMichal Kazior ch->antenna_max = arg->max_antenna_gain; 1727513527c8SAlan Liu ch->max_tx_power = arg->max_power; 17282d66721cSMichal Kazior 17292d66721cSMichal Kazior /* mode & flags share storage */ 17302d66721cSMichal Kazior ch->mode = arg->mode; 17312d66721cSMichal Kazior ch->flags |= __cpu_to_le32(flags); 17322d66721cSMichal Kazior } 17332d66721cSMichal Kazior 17345e3dd157SKalle Valo int ath10k_wmi_wait_for_service_ready(struct ath10k *ar) 17355e3dd157SKalle Valo { 17369eea5689SNicholas Mc Guire unsigned long time_left; 1737af762c0bSKalle Valo 17389eea5689SNicholas Mc Guire time_left = wait_for_completion_timeout(&ar->wmi.service_ready, 17395e3dd157SKalle Valo WMI_SERVICE_READY_TIMEOUT_HZ); 17409eea5689SNicholas Mc Guire if (!time_left) 17419eea5689SNicholas Mc Guire return -ETIMEDOUT; 17429eea5689SNicholas Mc Guire return 0; 17435e3dd157SKalle Valo } 17445e3dd157SKalle Valo 17455e3dd157SKalle Valo int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar) 17465e3dd157SKalle Valo { 17479eea5689SNicholas Mc Guire unsigned long time_left; 1748af762c0bSKalle Valo 17499eea5689SNicholas Mc Guire time_left = wait_for_completion_timeout(&ar->wmi.unified_ready, 17505e3dd157SKalle Valo WMI_UNIFIED_READY_TIMEOUT_HZ); 17519eea5689SNicholas Mc Guire if (!time_left) 17529eea5689SNicholas Mc Guire return -ETIMEDOUT; 17539eea5689SNicholas Mc Guire return 0; 17545e3dd157SKalle Valo } 17555e3dd157SKalle Valo 1756666a73f3SKalle Valo struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len) 17575e3dd157SKalle Valo { 17585e3dd157SKalle Valo struct sk_buff *skb; 17595e3dd157SKalle Valo u32 round_len = roundup(len, 4); 17605e3dd157SKalle Valo 17617aa7a72aSMichal Kazior skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len); 17625e3dd157SKalle Valo if (!skb) 17635e3dd157SKalle Valo return NULL; 17645e3dd157SKalle Valo 17655e3dd157SKalle Valo skb_reserve(skb, WMI_SKB_HEADROOM); 17665e3dd157SKalle Valo if (!IS_ALIGNED((unsigned long)skb->data, 4)) 17677aa7a72aSMichal Kazior ath10k_warn(ar, "Unaligned WMI skb\n"); 17685e3dd157SKalle Valo 17695e3dd157SKalle Valo skb_put(skb, round_len); 17705e3dd157SKalle Valo memset(skb->data, 0, round_len); 17715e3dd157SKalle Valo 17725e3dd157SKalle Valo return skb; 17735e3dd157SKalle Valo } 17745e3dd157SKalle Valo 17755e3dd157SKalle Valo static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb) 17765e3dd157SKalle Valo { 17775e3dd157SKalle Valo dev_kfree_skb(skb); 17785e3dd157SKalle Valo } 17795e3dd157SKalle Valo 1780d7579d12SMichal Kazior int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb, 1781ce42870eSBartosz Markowski u32 cmd_id) 17825e3dd157SKalle Valo { 17835e3dd157SKalle Valo struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); 17845e3dd157SKalle Valo struct wmi_cmd_hdr *cmd_hdr; 1785be8b3943SMichal Kazior int ret; 17865e3dd157SKalle Valo u32 cmd = 0; 17875e3dd157SKalle Valo 17885e3dd157SKalle Valo if (skb_push(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 17895e3dd157SKalle Valo return -ENOMEM; 17905e3dd157SKalle Valo 17915e3dd157SKalle Valo cmd |= SM(cmd_id, WMI_CMD_HDR_CMD_ID); 17925e3dd157SKalle Valo 17935e3dd157SKalle Valo cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 17945e3dd157SKalle Valo cmd_hdr->cmd_id = __cpu_to_le32(cmd); 17955e3dd157SKalle Valo 17965e3dd157SKalle Valo memset(skb_cb, 0, sizeof(*skb_cb)); 17979ef0f58eSCarl Huang trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len); 1798be8b3943SMichal Kazior ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb); 17995e3dd157SKalle Valo 1800be8b3943SMichal Kazior if (ret) 1801be8b3943SMichal Kazior goto err_pull; 18025e3dd157SKalle Valo 18035e3dd157SKalle Valo return 0; 1804be8b3943SMichal Kazior 1805be8b3943SMichal Kazior err_pull: 1806be8b3943SMichal Kazior skb_pull(skb, sizeof(struct wmi_cmd_hdr)); 1807be8b3943SMichal Kazior return ret; 1808be8b3943SMichal Kazior } 1809be8b3943SMichal Kazior 1810ed54388aSMichal Kazior static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif) 1811ed54388aSMichal Kazior { 1812af21319fSMichal Kazior struct ath10k *ar = arvif->ar; 18139ad50182SMichal Kazior struct ath10k_skb_cb *cb; 1814af21319fSMichal Kazior struct sk_buff *bcn; 181566b8a010SMichal Kazior bool dtim_zero; 181666b8a010SMichal Kazior bool deliver_cab; 1817ed54388aSMichal Kazior int ret; 1818ed54388aSMichal Kazior 1819af21319fSMichal Kazior spin_lock_bh(&ar->data_lock); 1820ed54388aSMichal Kazior 18219ad50182SMichal Kazior bcn = arvif->beacon; 1822ed54388aSMichal Kazior 1823af21319fSMichal Kazior if (!bcn) 1824af21319fSMichal Kazior goto unlock; 1825ed54388aSMichal Kazior 18269ad50182SMichal Kazior cb = ATH10K_SKB_CB(bcn); 1827ed54388aSMichal Kazior 1828af21319fSMichal Kazior switch (arvif->beacon_state) { 1829af21319fSMichal Kazior case ATH10K_BEACON_SENDING: 1830af21319fSMichal Kazior case ATH10K_BEACON_SENT: 1831af21319fSMichal Kazior break; 1832af21319fSMichal Kazior case ATH10K_BEACON_SCHEDULED: 1833af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SENDING; 1834af21319fSMichal Kazior spin_unlock_bh(&ar->data_lock); 1835af21319fSMichal Kazior 183666b8a010SMichal Kazior dtim_zero = !!(cb->flags & ATH10K_SKB_F_DTIM_ZERO); 183766b8a010SMichal Kazior deliver_cab = !!(cb->flags & ATH10K_SKB_F_DELIVER_CAB); 1838af21319fSMichal Kazior ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar, 1839af21319fSMichal Kazior arvif->vdev_id, 1840af21319fSMichal Kazior bcn->data, bcn->len, 1841af21319fSMichal Kazior cb->paddr, 184266b8a010SMichal Kazior dtim_zero, 184366b8a010SMichal Kazior deliver_cab); 1844ed54388aSMichal Kazior 1845af21319fSMichal Kazior spin_lock_bh(&ar->data_lock); 1846af21319fSMichal Kazior 1847af21319fSMichal Kazior if (ret == 0) 1848af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SENT; 1849af21319fSMichal Kazior else 1850af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SCHEDULED; 1851af21319fSMichal Kazior } 1852af21319fSMichal Kazior 1853af21319fSMichal Kazior unlock: 1854af21319fSMichal Kazior spin_unlock_bh(&ar->data_lock); 1855ed54388aSMichal Kazior } 1856ed54388aSMichal Kazior 1857ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac, 1858ed54388aSMichal Kazior struct ieee80211_vif *vif) 1859ed54388aSMichal Kazior { 186056ac13bfSAmadeusz Sławiński struct ath10k_vif *arvif = (void *)vif->drv_priv; 1861ed54388aSMichal Kazior 1862ed54388aSMichal Kazior ath10k_wmi_tx_beacon_nowait(arvif); 1863ed54388aSMichal Kazior } 1864ed54388aSMichal Kazior 1865ed54388aSMichal Kazior static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar) 1866ed54388aSMichal Kazior { 1867ed54388aSMichal Kazior ieee80211_iterate_active_interfaces_atomic(ar->hw, 1868ed54388aSMichal Kazior IEEE80211_IFACE_ITER_NORMAL, 1869ed54388aSMichal Kazior ath10k_wmi_tx_beacons_iter, 1870ed54388aSMichal Kazior NULL); 1871ed54388aSMichal Kazior } 1872ed54388aSMichal Kazior 187312acbc43SMichal Kazior static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar) 1874be8b3943SMichal Kazior { 1875ed54388aSMichal Kazior /* try to send pending beacons first. they take priority */ 1876ed54388aSMichal Kazior ath10k_wmi_tx_beacons_nowait(ar); 1877ed54388aSMichal Kazior 1878be8b3943SMichal Kazior wake_up(&ar->wmi.tx_credits_wq); 1879be8b3943SMichal Kazior } 1880be8b3943SMichal Kazior 1881666a73f3SKalle Valo int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id) 1882be8b3943SMichal Kazior { 188334957b25SBartosz Markowski int ret = -EOPNOTSUPP; 1884be8b3943SMichal Kazior 188556b84287SKalle Valo might_sleep(); 188656b84287SKalle Valo 188734957b25SBartosz Markowski if (cmd_id == WMI_CMD_UNSUPPORTED) { 18887aa7a72aSMichal Kazior ath10k_warn(ar, "wmi command %d is not supported by firmware\n", 188955321559SBartosz Markowski cmd_id); 189055321559SBartosz Markowski return ret; 189155321559SBartosz Markowski } 1892be8b3943SMichal Kazior 1893be8b3943SMichal Kazior wait_event_timeout(ar->wmi.tx_credits_wq, ({ 1894ed54388aSMichal Kazior /* try to send pending beacons first. they take priority */ 1895ed54388aSMichal Kazior ath10k_wmi_tx_beacons_nowait(ar); 1896ed54388aSMichal Kazior 1897be8b3943SMichal Kazior ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id); 18987962b0d8SMichal Kazior 18997962b0d8SMichal Kazior if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) 19007962b0d8SMichal Kazior ret = -ESHUTDOWN; 19017962b0d8SMichal Kazior 1902be8b3943SMichal Kazior (ret != -EAGAIN); 1903be8b3943SMichal Kazior }), 3 * HZ); 1904be8b3943SMichal Kazior 1905be8b3943SMichal Kazior if (ret) 1906be8b3943SMichal Kazior dev_kfree_skb_any(skb); 1907be8b3943SMichal Kazior 1908a9911937SMartin Willi if (ret == -EAGAIN) { 1909a9911937SMartin Willi ath10k_warn(ar, "wmi command %d timeout, restarting hardware\n", 1910a9911937SMartin Willi cmd_id); 1911a9911937SMartin Willi queue_work(ar->workqueue, &ar->restart_work); 1912a9911937SMartin Willi } 1913a9911937SMartin Willi 1914be8b3943SMichal Kazior return ret; 19155e3dd157SKalle Valo } 19165e3dd157SKalle Valo 1917d7579d12SMichal Kazior static struct sk_buff * 1918d7579d12SMichal Kazior ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) 19195e00d31aSBartosz Markowski { 1920609db229SMichal Kazior struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu); 1921a66cd733SBob Copeland struct ath10k_vif *arvif; 19225e00d31aSBartosz Markowski struct wmi_mgmt_tx_cmd *cmd; 19235e00d31aSBartosz Markowski struct ieee80211_hdr *hdr; 1924d7579d12SMichal Kazior struct sk_buff *skb; 19255e00d31aSBartosz Markowski int len; 1926609db229SMichal Kazior u32 vdev_id; 1927d7579d12SMichal Kazior u32 buf_len = msdu->len; 19285e00d31aSBartosz Markowski u16 fc; 19295e00d31aSBartosz Markowski 1930d7579d12SMichal Kazior hdr = (struct ieee80211_hdr *)msdu->data; 19315e00d31aSBartosz Markowski fc = le16_to_cpu(hdr->frame_control); 19325e00d31aSBartosz Markowski 1933a66cd733SBob Copeland if (cb->vif) { 1934a66cd733SBob Copeland arvif = (void *)cb->vif->drv_priv; 1935609db229SMichal Kazior vdev_id = arvif->vdev_id; 1936a66cd733SBob Copeland } else { 1937609db229SMichal Kazior vdev_id = 0; 1938a66cd733SBob Copeland } 1939609db229SMichal Kazior 19405e00d31aSBartosz Markowski if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control))) 1941d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 19425e00d31aSBartosz Markowski 1943d7579d12SMichal Kazior len = sizeof(cmd->hdr) + msdu->len; 1944eeab266cSMarek Kwaczynski 1945eeab266cSMarek Kwaczynski if ((ieee80211_is_action(hdr->frame_control) || 1946eeab266cSMarek Kwaczynski ieee80211_is_deauth(hdr->frame_control) || 1947eeab266cSMarek Kwaczynski ieee80211_is_disassoc(hdr->frame_control)) && 1948eeab266cSMarek Kwaczynski ieee80211_has_protected(hdr->frame_control)) { 1949eeab266cSMarek Kwaczynski len += IEEE80211_CCMP_MIC_LEN; 1950eeab266cSMarek Kwaczynski buf_len += IEEE80211_CCMP_MIC_LEN; 1951eeab266cSMarek Kwaczynski } 1952eeab266cSMarek Kwaczynski 19535e00d31aSBartosz Markowski len = round_up(len, 4); 19545e00d31aSBartosz Markowski 1955d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 1956d7579d12SMichal Kazior if (!skb) 1957d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 19585e00d31aSBartosz Markowski 1959d7579d12SMichal Kazior cmd = (struct wmi_mgmt_tx_cmd *)skb->data; 19605e00d31aSBartosz Markowski 1961609db229SMichal Kazior cmd->hdr.vdev_id = __cpu_to_le32(vdev_id); 19625e00d31aSBartosz Markowski cmd->hdr.tx_rate = 0; 19635e00d31aSBartosz Markowski cmd->hdr.tx_power = 0; 1964eeab266cSMarek Kwaczynski cmd->hdr.buf_len = __cpu_to_le32(buf_len); 19655e00d31aSBartosz Markowski 1966b25f32cbSKalle Valo ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr)); 1967d7579d12SMichal Kazior memcpy(cmd->buf, msdu->data, msdu->len); 19685e00d31aSBartosz Markowski 196975b34800SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n", 1970d7579d12SMichal Kazior msdu, skb->len, fc & IEEE80211_FCTL_FTYPE, 19715e00d31aSBartosz Markowski fc & IEEE80211_FCTL_STYPE); 19725ce8e7fdSRajkumar Manoharan trace_ath10k_tx_hdr(ar, skb->data, skb->len); 19735ce8e7fdSRajkumar Manoharan trace_ath10k_tx_payload(ar, skb->data, skb->len); 19745e00d31aSBartosz Markowski 1975d7579d12SMichal Kazior return skb; 19765e00d31aSBartosz Markowski } 19775e00d31aSBartosz Markowski 19785c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_started(struct ath10k *ar) 19795c81c7fdSMichal Kazior { 19805c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 19815c81c7fdSMichal Kazior 19825c81c7fdSMichal Kazior switch (ar->scan.state) { 19835c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 19845c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 19855c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 19867aa7a72aSMichal Kazior ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n", 19875c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 19885c81c7fdSMichal Kazior ar->scan.state); 19895c81c7fdSMichal Kazior break; 19905c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 19915c81c7fdSMichal Kazior ar->scan.state = ATH10K_SCAN_RUNNING; 19925c81c7fdSMichal Kazior 19935c81c7fdSMichal Kazior if (ar->scan.is_roc) 19945c81c7fdSMichal Kazior ieee80211_ready_on_channel(ar->hw); 19955c81c7fdSMichal Kazior 19965c81c7fdSMichal Kazior complete(&ar->scan.started); 19975c81c7fdSMichal Kazior break; 19985c81c7fdSMichal Kazior } 19995c81c7fdSMichal Kazior } 20005c81c7fdSMichal Kazior 20012f9eec0bSBen Greear static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar) 20022f9eec0bSBen Greear { 20032f9eec0bSBen Greear lockdep_assert_held(&ar->data_lock); 20042f9eec0bSBen Greear 20052f9eec0bSBen Greear switch (ar->scan.state) { 20062f9eec0bSBen Greear case ATH10K_SCAN_IDLE: 20072f9eec0bSBen Greear case ATH10K_SCAN_RUNNING: 20082f9eec0bSBen Greear case ATH10K_SCAN_ABORTING: 20092f9eec0bSBen Greear ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n", 20102f9eec0bSBen Greear ath10k_scan_state_str(ar->scan.state), 20112f9eec0bSBen Greear ar->scan.state); 20122f9eec0bSBen Greear break; 20132f9eec0bSBen Greear case ATH10K_SCAN_STARTING: 20142f9eec0bSBen Greear complete(&ar->scan.started); 20152f9eec0bSBen Greear __ath10k_scan_finish(ar); 20162f9eec0bSBen Greear break; 20172f9eec0bSBen Greear } 20182f9eec0bSBen Greear } 20192f9eec0bSBen Greear 20205c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_completed(struct ath10k *ar) 20215c81c7fdSMichal Kazior { 20225c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 20235c81c7fdSMichal Kazior 20245c81c7fdSMichal Kazior switch (ar->scan.state) { 20255c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 20265c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 20275c81c7fdSMichal Kazior /* One suspected reason scan can be completed while starting is 20285c81c7fdSMichal Kazior * if firmware fails to deliver all scan events to the host, 20295c81c7fdSMichal Kazior * e.g. when transport pipe is full. This has been observed 20305c81c7fdSMichal Kazior * with spectral scan phyerr events starving wmi transport 20315c81c7fdSMichal Kazior * pipe. In such case the "scan completed" event should be (and 20325c81c7fdSMichal Kazior * is) ignored by the host as it may be just firmware's scan 20335c81c7fdSMichal Kazior * state machine recovering. 20345c81c7fdSMichal Kazior */ 20357aa7a72aSMichal Kazior ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n", 20365c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 20375c81c7fdSMichal Kazior ar->scan.state); 20385c81c7fdSMichal Kazior break; 20395c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 20405c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 20415c81c7fdSMichal Kazior __ath10k_scan_finish(ar); 20425c81c7fdSMichal Kazior break; 20435c81c7fdSMichal Kazior } 20445c81c7fdSMichal Kazior } 20455c81c7fdSMichal Kazior 20465c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar) 20475c81c7fdSMichal Kazior { 20485c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 20495c81c7fdSMichal Kazior 20505c81c7fdSMichal Kazior switch (ar->scan.state) { 20515c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 20525c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 20537aa7a72aSMichal Kazior ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n", 20545c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 20555c81c7fdSMichal Kazior ar->scan.state); 20565c81c7fdSMichal Kazior break; 20575c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 20585c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 20595c81c7fdSMichal Kazior ar->scan_channel = NULL; 20605c81c7fdSMichal Kazior break; 20615c81c7fdSMichal Kazior } 20625c81c7fdSMichal Kazior } 20635c81c7fdSMichal Kazior 20645c81c7fdSMichal Kazior static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq) 20655c81c7fdSMichal Kazior { 20665c81c7fdSMichal Kazior lockdep_assert_held(&ar->data_lock); 20675c81c7fdSMichal Kazior 20685c81c7fdSMichal Kazior switch (ar->scan.state) { 20695c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 20705c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 20717aa7a72aSMichal Kazior ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n", 20725c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), 20735c81c7fdSMichal Kazior ar->scan.state); 20745c81c7fdSMichal Kazior break; 20755c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 20765c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 20775c81c7fdSMichal Kazior ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq); 20785c81c7fdSMichal Kazior 20795c81c7fdSMichal Kazior if (ar->scan.is_roc && ar->scan.roc_freq == freq) 20805c81c7fdSMichal Kazior complete(&ar->scan.on_channel); 20815c81c7fdSMichal Kazior break; 20825c81c7fdSMichal Kazior } 20835c81c7fdSMichal Kazior } 20845c81c7fdSMichal Kazior 20859ff8b724SMichal Kazior static const char * 20869ff8b724SMichal Kazior ath10k_wmi_event_scan_type_str(enum wmi_scan_event_type type, 20879ff8b724SMichal Kazior enum wmi_scan_completion_reason reason) 20889ff8b724SMichal Kazior { 20899ff8b724SMichal Kazior switch (type) { 20909ff8b724SMichal Kazior case WMI_SCAN_EVENT_STARTED: 20919ff8b724SMichal Kazior return "started"; 20929ff8b724SMichal Kazior case WMI_SCAN_EVENT_COMPLETED: 20939ff8b724SMichal Kazior switch (reason) { 20949ff8b724SMichal Kazior case WMI_SCAN_REASON_COMPLETED: 20959ff8b724SMichal Kazior return "completed"; 20969ff8b724SMichal Kazior case WMI_SCAN_REASON_CANCELLED: 20979ff8b724SMichal Kazior return "completed [cancelled]"; 20989ff8b724SMichal Kazior case WMI_SCAN_REASON_PREEMPTED: 20999ff8b724SMichal Kazior return "completed [preempted]"; 21009ff8b724SMichal Kazior case WMI_SCAN_REASON_TIMEDOUT: 21019ff8b724SMichal Kazior return "completed [timedout]"; 2102b2297baaSRaja Mani case WMI_SCAN_REASON_INTERNAL_FAILURE: 2103b2297baaSRaja Mani return "completed [internal err]"; 21049ff8b724SMichal Kazior case WMI_SCAN_REASON_MAX: 21059ff8b724SMichal Kazior break; 21069ff8b724SMichal Kazior } 21079ff8b724SMichal Kazior return "completed [unknown]"; 21089ff8b724SMichal Kazior case WMI_SCAN_EVENT_BSS_CHANNEL: 21099ff8b724SMichal Kazior return "bss channel"; 21109ff8b724SMichal Kazior case WMI_SCAN_EVENT_FOREIGN_CHANNEL: 21119ff8b724SMichal Kazior return "foreign channel"; 21129ff8b724SMichal Kazior case WMI_SCAN_EVENT_DEQUEUED: 21139ff8b724SMichal Kazior return "dequeued"; 21149ff8b724SMichal Kazior case WMI_SCAN_EVENT_PREEMPTED: 21159ff8b724SMichal Kazior return "preempted"; 21169ff8b724SMichal Kazior case WMI_SCAN_EVENT_START_FAILED: 21179ff8b724SMichal Kazior return "start failed"; 2118b2297baaSRaja Mani case WMI_SCAN_EVENT_RESTARTED: 2119b2297baaSRaja Mani return "restarted"; 2120b2297baaSRaja Mani case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT: 2121b2297baaSRaja Mani return "foreign channel exit"; 21229ff8b724SMichal Kazior default: 21239ff8b724SMichal Kazior return "unknown"; 21249ff8b724SMichal Kazior } 21259ff8b724SMichal Kazior } 21269ff8b724SMichal Kazior 2127d7579d12SMichal Kazior static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb, 212832653cf1SMichal Kazior struct wmi_scan_ev_arg *arg) 212932653cf1SMichal Kazior { 213032653cf1SMichal Kazior struct wmi_scan_event *ev = (void *)skb->data; 213132653cf1SMichal Kazior 213232653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 213332653cf1SMichal Kazior return -EPROTO; 213432653cf1SMichal Kazior 213532653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 213632653cf1SMichal Kazior arg->event_type = ev->event_type; 213732653cf1SMichal Kazior arg->reason = ev->reason; 213832653cf1SMichal Kazior arg->channel_freq = ev->channel_freq; 213932653cf1SMichal Kazior arg->scan_req_id = ev->scan_req_id; 214032653cf1SMichal Kazior arg->scan_id = ev->scan_id; 214132653cf1SMichal Kazior arg->vdev_id = ev->vdev_id; 214232653cf1SMichal Kazior 214332653cf1SMichal Kazior return 0; 214432653cf1SMichal Kazior } 214532653cf1SMichal Kazior 21460226d602SMichal Kazior int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb) 21475e3dd157SKalle Valo { 214832653cf1SMichal Kazior struct wmi_scan_ev_arg arg = {}; 21495e3dd157SKalle Valo enum wmi_scan_event_type event_type; 21505e3dd157SKalle Valo enum wmi_scan_completion_reason reason; 21515e3dd157SKalle Valo u32 freq; 21525e3dd157SKalle Valo u32 req_id; 21535e3dd157SKalle Valo u32 scan_id; 21545e3dd157SKalle Valo u32 vdev_id; 215532653cf1SMichal Kazior int ret; 21565e3dd157SKalle Valo 2157d7579d12SMichal Kazior ret = ath10k_wmi_pull_scan(ar, skb, &arg); 215832653cf1SMichal Kazior if (ret) { 215932653cf1SMichal Kazior ath10k_warn(ar, "failed to parse scan event: %d\n", ret); 216032653cf1SMichal Kazior return ret; 216132653cf1SMichal Kazior } 216232653cf1SMichal Kazior 216332653cf1SMichal Kazior event_type = __le32_to_cpu(arg.event_type); 216432653cf1SMichal Kazior reason = __le32_to_cpu(arg.reason); 216532653cf1SMichal Kazior freq = __le32_to_cpu(arg.channel_freq); 216632653cf1SMichal Kazior req_id = __le32_to_cpu(arg.scan_req_id); 216732653cf1SMichal Kazior scan_id = __le32_to_cpu(arg.scan_id); 216832653cf1SMichal Kazior vdev_id = __le32_to_cpu(arg.vdev_id); 21695e3dd157SKalle Valo 21705e3dd157SKalle Valo spin_lock_bh(&ar->data_lock); 21715e3dd157SKalle Valo 21727aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 21735c81c7fdSMichal Kazior "scan event %s type %d reason %d freq %d req_id %d scan_id %d vdev_id %d state %s (%d)\n", 21745c81c7fdSMichal Kazior ath10k_wmi_event_scan_type_str(event_type, reason), 21755c81c7fdSMichal Kazior event_type, reason, freq, req_id, scan_id, vdev_id, 21765c81c7fdSMichal Kazior ath10k_scan_state_str(ar->scan.state), ar->scan.state); 21775c81c7fdSMichal Kazior 21785e3dd157SKalle Valo switch (event_type) { 21795e3dd157SKalle Valo case WMI_SCAN_EVENT_STARTED: 21805c81c7fdSMichal Kazior ath10k_wmi_event_scan_started(ar); 21815e3dd157SKalle Valo break; 21825e3dd157SKalle Valo case WMI_SCAN_EVENT_COMPLETED: 21835c81c7fdSMichal Kazior ath10k_wmi_event_scan_completed(ar); 21845e3dd157SKalle Valo break; 21855e3dd157SKalle Valo case WMI_SCAN_EVENT_BSS_CHANNEL: 21865c81c7fdSMichal Kazior ath10k_wmi_event_scan_bss_chan(ar); 21875e3dd157SKalle Valo break; 21885e3dd157SKalle Valo case WMI_SCAN_EVENT_FOREIGN_CHANNEL: 21895c81c7fdSMichal Kazior ath10k_wmi_event_scan_foreign_chan(ar, freq); 21905c81c7fdSMichal Kazior break; 21915c81c7fdSMichal Kazior case WMI_SCAN_EVENT_START_FAILED: 21927aa7a72aSMichal Kazior ath10k_warn(ar, "received scan start failure event\n"); 21932f9eec0bSBen Greear ath10k_wmi_event_scan_start_failed(ar); 21945e3dd157SKalle Valo break; 21955e3dd157SKalle Valo case WMI_SCAN_EVENT_DEQUEUED: 21965e3dd157SKalle Valo case WMI_SCAN_EVENT_PREEMPTED: 2197b2297baaSRaja Mani case WMI_SCAN_EVENT_RESTARTED: 2198b2297baaSRaja Mani case WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT: 21995e3dd157SKalle Valo default: 22005e3dd157SKalle Valo break; 22015e3dd157SKalle Valo } 22025e3dd157SKalle Valo 22035e3dd157SKalle Valo spin_unlock_bh(&ar->data_lock); 22045e3dd157SKalle Valo return 0; 22055e3dd157SKalle Valo } 22065e3dd157SKalle Valo 2207504f6cdfSSujith Manoharan /* If keys are configured, HW decrypts all frames 2208504f6cdfSSujith Manoharan * with protected bit set. Mark such frames as decrypted. 2209504f6cdfSSujith Manoharan */ 2210504f6cdfSSujith Manoharan static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar, 2211504f6cdfSSujith Manoharan struct sk_buff *skb, 2212504f6cdfSSujith Manoharan struct ieee80211_rx_status *status) 2213504f6cdfSSujith Manoharan { 2214504f6cdfSSujith Manoharan struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 2215504f6cdfSSujith Manoharan unsigned int hdrlen; 2216504f6cdfSSujith Manoharan bool peer_key; 2217504f6cdfSSujith Manoharan u8 *addr, keyidx; 2218504f6cdfSSujith Manoharan 2219504f6cdfSSujith Manoharan if (!ieee80211_is_auth(hdr->frame_control) || 2220504f6cdfSSujith Manoharan !ieee80211_has_protected(hdr->frame_control)) 2221504f6cdfSSujith Manoharan return; 2222504f6cdfSSujith Manoharan 2223504f6cdfSSujith Manoharan hdrlen = ieee80211_hdrlen(hdr->frame_control); 2224504f6cdfSSujith Manoharan if (skb->len < (hdrlen + IEEE80211_WEP_IV_LEN)) 2225504f6cdfSSujith Manoharan return; 2226504f6cdfSSujith Manoharan 2227504f6cdfSSujith Manoharan keyidx = skb->data[hdrlen + (IEEE80211_WEP_IV_LEN - 1)] >> WEP_KEYID_SHIFT; 2228504f6cdfSSujith Manoharan addr = ieee80211_get_SA(hdr); 2229504f6cdfSSujith Manoharan 2230504f6cdfSSujith Manoharan spin_lock_bh(&ar->data_lock); 2231504f6cdfSSujith Manoharan peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx); 2232504f6cdfSSujith Manoharan spin_unlock_bh(&ar->data_lock); 2233504f6cdfSSujith Manoharan 2234504f6cdfSSujith Manoharan if (peer_key) { 2235504f6cdfSSujith Manoharan ath10k_dbg(ar, ATH10K_DBG_MAC, 2236504f6cdfSSujith Manoharan "mac wep key present for peer %pM\n", addr); 2237504f6cdfSSujith Manoharan status->flag |= RX_FLAG_DECRYPTED; 2238504f6cdfSSujith Manoharan } 2239504f6cdfSSujith Manoharan } 2240504f6cdfSSujith Manoharan 2241d7579d12SMichal Kazior static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb, 2242d7579d12SMichal Kazior struct wmi_mgmt_rx_ev_arg *arg) 22435e3dd157SKalle Valo { 22440d9b0438SMichal Kazior struct wmi_mgmt_rx_event_v1 *ev_v1; 22450d9b0438SMichal Kazior struct wmi_mgmt_rx_event_v2 *ev_v2; 22460d9b0438SMichal Kazior struct wmi_mgmt_rx_hdr_v1 *ev_hdr; 22478d130963SPeter Oh struct wmi_mgmt_rx_ext_info *ext_info; 224832653cf1SMichal Kazior size_t pull_len; 224932653cf1SMichal Kazior u32 msdu_len; 22508d130963SPeter Oh u32 len; 22515e3dd157SKalle Valo 2252c4cdf753SKalle Valo if (test_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, 2253c4cdf753SKalle Valo ar->running_fw->fw_file.fw_features)) { 22540d9b0438SMichal Kazior ev_v2 = (struct wmi_mgmt_rx_event_v2 *)skb->data; 22550d9b0438SMichal Kazior ev_hdr = &ev_v2->hdr.v1; 22560d9b0438SMichal Kazior pull_len = sizeof(*ev_v2); 22570d9b0438SMichal Kazior } else { 22580d9b0438SMichal Kazior ev_v1 = (struct wmi_mgmt_rx_event_v1 *)skb->data; 22590d9b0438SMichal Kazior ev_hdr = &ev_v1->hdr; 22600d9b0438SMichal Kazior pull_len = sizeof(*ev_v1); 22610d9b0438SMichal Kazior } 22620d9b0438SMichal Kazior 226332653cf1SMichal Kazior if (skb->len < pull_len) 226432653cf1SMichal Kazior return -EPROTO; 226532653cf1SMichal Kazior 226632653cf1SMichal Kazior skb_pull(skb, pull_len); 226732653cf1SMichal Kazior arg->channel = ev_hdr->channel; 226832653cf1SMichal Kazior arg->buf_len = ev_hdr->buf_len; 226932653cf1SMichal Kazior arg->status = ev_hdr->status; 227032653cf1SMichal Kazior arg->snr = ev_hdr->snr; 227132653cf1SMichal Kazior arg->phy_mode = ev_hdr->phy_mode; 227232653cf1SMichal Kazior arg->rate = ev_hdr->rate; 227332653cf1SMichal Kazior 227432653cf1SMichal Kazior msdu_len = __le32_to_cpu(arg->buf_len); 227532653cf1SMichal Kazior if (skb->len < msdu_len) 227632653cf1SMichal Kazior return -EPROTO; 227732653cf1SMichal Kazior 22788d130963SPeter Oh if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) { 22798d130963SPeter Oh len = ALIGN(le32_to_cpu(arg->buf_len), 4); 22808d130963SPeter Oh ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len); 22818d130963SPeter Oh memcpy(&arg->ext_info, ext_info, 22828d130963SPeter Oh sizeof(struct wmi_mgmt_rx_ext_info)); 22838d130963SPeter Oh } 228432653cf1SMichal Kazior /* the WMI buffer might've ended up being padded to 4 bytes due to HTC 228532653cf1SMichal Kazior * trailer with credit update. Trim the excess garbage. 228632653cf1SMichal Kazior */ 228732653cf1SMichal Kazior skb_trim(skb, msdu_len); 228832653cf1SMichal Kazior 228932653cf1SMichal Kazior return 0; 229032653cf1SMichal Kazior } 229132653cf1SMichal Kazior 22921c092961SRaja Mani static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar, 22931c092961SRaja Mani struct sk_buff *skb, 22941c092961SRaja Mani struct wmi_mgmt_rx_ev_arg *arg) 22951c092961SRaja Mani { 22961c092961SRaja Mani struct wmi_10_4_mgmt_rx_event *ev; 22971c092961SRaja Mani struct wmi_10_4_mgmt_rx_hdr *ev_hdr; 22981c092961SRaja Mani size_t pull_len; 22991c092961SRaja Mani u32 msdu_len; 23007d5efd08SPeter Oh struct wmi_mgmt_rx_ext_info *ext_info; 23017d5efd08SPeter Oh u32 len; 23021c092961SRaja Mani 23031c092961SRaja Mani ev = (struct wmi_10_4_mgmt_rx_event *)skb->data; 23041c092961SRaja Mani ev_hdr = &ev->hdr; 23051c092961SRaja Mani pull_len = sizeof(*ev); 23061c092961SRaja Mani 23071c092961SRaja Mani if (skb->len < pull_len) 23081c092961SRaja Mani return -EPROTO; 23091c092961SRaja Mani 23101c092961SRaja Mani skb_pull(skb, pull_len); 23111c092961SRaja Mani arg->channel = ev_hdr->channel; 23121c092961SRaja Mani arg->buf_len = ev_hdr->buf_len; 23131c092961SRaja Mani arg->status = ev_hdr->status; 23141c092961SRaja Mani arg->snr = ev_hdr->snr; 23151c092961SRaja Mani arg->phy_mode = ev_hdr->phy_mode; 23161c092961SRaja Mani arg->rate = ev_hdr->rate; 23171c092961SRaja Mani 23181c092961SRaja Mani msdu_len = __le32_to_cpu(arg->buf_len); 23191c092961SRaja Mani if (skb->len < msdu_len) 23201c092961SRaja Mani return -EPROTO; 23211c092961SRaja Mani 23227d5efd08SPeter Oh if (le32_to_cpu(arg->status) & WMI_RX_STATUS_EXT_INFO) { 23237d5efd08SPeter Oh len = ALIGN(le32_to_cpu(arg->buf_len), 4); 23247d5efd08SPeter Oh ext_info = (struct wmi_mgmt_rx_ext_info *)(skb->data + len); 23257d5efd08SPeter Oh memcpy(&arg->ext_info, ext_info, 23267d5efd08SPeter Oh sizeof(struct wmi_mgmt_rx_ext_info)); 23277d5efd08SPeter Oh } 23287d5efd08SPeter Oh 23291c092961SRaja Mani /* Make sure bytes added for padding are removed. */ 23301c092961SRaja Mani skb_trim(skb, msdu_len); 23311c092961SRaja Mani 23321c092961SRaja Mani return 0; 23331c092961SRaja Mani } 23341c092961SRaja Mani 23357d42298eSRajkumar Manoharan static bool ath10k_wmi_rx_is_decrypted(struct ath10k *ar, 23367d42298eSRajkumar Manoharan struct ieee80211_hdr *hdr) 23377d42298eSRajkumar Manoharan { 23387d42298eSRajkumar Manoharan if (!ieee80211_has_protected(hdr->frame_control)) 23397d42298eSRajkumar Manoharan return false; 23407d42298eSRajkumar Manoharan 23417d42298eSRajkumar Manoharan /* FW delivers WEP Shared Auth frame with Protected Bit set and 23427d42298eSRajkumar Manoharan * encrypted payload. However in case of PMF it delivers decrypted 23437d42298eSRajkumar Manoharan * frames with Protected Bit set. 23447d42298eSRajkumar Manoharan */ 23457d42298eSRajkumar Manoharan if (ieee80211_is_auth(hdr->frame_control)) 23467d42298eSRajkumar Manoharan return false; 23477d42298eSRajkumar Manoharan 23487d42298eSRajkumar Manoharan /* qca99x0 based FW delivers broadcast or multicast management frames 23497d42298eSRajkumar Manoharan * (ex: group privacy action frames in mesh) as encrypted payload. 23507d42298eSRajkumar Manoharan */ 23517d42298eSRajkumar Manoharan if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) && 23527d42298eSRajkumar Manoharan ar->hw_params.sw_decrypt_mcast_mgmt) 23537d42298eSRajkumar Manoharan return false; 23547d42298eSRajkumar Manoharan 23557d42298eSRajkumar Manoharan return true; 23567d42298eSRajkumar Manoharan } 23577d42298eSRajkumar Manoharan 23584b816f17SAbhishek Ambure static int 23594b816f17SAbhishek Ambure wmi_process_mgmt_tx_comp(struct ath10k *ar, struct mgmt_tx_compl_params *param) 2360dc405152SRakesh Pillai { 2361dc405152SRakesh Pillai struct ath10k_mgmt_tx_pkt_addr *pkt_addr; 2362dc405152SRakesh Pillai struct ath10k_wmi *wmi = &ar->wmi; 2363dc405152SRakesh Pillai struct ieee80211_tx_info *info; 2364dc405152SRakesh Pillai struct sk_buff *msdu; 2365dc405152SRakesh Pillai int ret; 2366dc405152SRakesh Pillai 2367dc405152SRakesh Pillai spin_lock_bh(&ar->data_lock); 2368dc405152SRakesh Pillai 23694b816f17SAbhishek Ambure pkt_addr = idr_find(&wmi->mgmt_pending_tx, param->desc_id); 2370dc405152SRakesh Pillai if (!pkt_addr) { 2371dc405152SRakesh Pillai ath10k_warn(ar, "received mgmt tx completion for invalid msdu_id: %d\n", 23724b816f17SAbhishek Ambure param->desc_id); 2373dc405152SRakesh Pillai ret = -ENOENT; 2374dc405152SRakesh Pillai goto out; 2375dc405152SRakesh Pillai } 2376dc405152SRakesh Pillai 2377dc405152SRakesh Pillai msdu = pkt_addr->vaddr; 2378dc405152SRakesh Pillai dma_unmap_single(ar->dev, pkt_addr->paddr, 23796e8a8991SRakesh Pillai msdu->len, DMA_TO_DEVICE); 2380dc405152SRakesh Pillai info = IEEE80211_SKB_CB(msdu); 2381058a7eabSRakesh Pillai 23824b816f17SAbhishek Ambure if (param->status) { 2383058a7eabSRakesh Pillai info->flags &= ~IEEE80211_TX_STAT_ACK; 23844b816f17SAbhishek Ambure } else { 2385058a7eabSRakesh Pillai info->flags |= IEEE80211_TX_STAT_ACK; 23864b816f17SAbhishek Ambure info->status.ack_signal = ATH10K_DEFAULT_NOISE_FLOOR + 23874b816f17SAbhishek Ambure param->ack_rssi; 23884b816f17SAbhishek Ambure info->status.is_valid_ack_signal = true; 23894b816f17SAbhishek Ambure } 2390058a7eabSRakesh Pillai 2391dc405152SRakesh Pillai ieee80211_tx_status_irqsafe(ar->hw, msdu); 2392dc405152SRakesh Pillai 2393dc405152SRakesh Pillai ret = 0; 2394dc405152SRakesh Pillai 2395dc405152SRakesh Pillai out: 23964b816f17SAbhishek Ambure idr_remove(&wmi->mgmt_pending_tx, param->desc_id); 2397dc405152SRakesh Pillai spin_unlock_bh(&ar->data_lock); 2398dc405152SRakesh Pillai return ret; 2399dc405152SRakesh Pillai } 2400dc405152SRakesh Pillai 2401dc405152SRakesh Pillai int ath10k_wmi_event_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb) 2402dc405152SRakesh Pillai { 2403dc405152SRakesh Pillai struct wmi_tlv_mgmt_tx_compl_ev_arg arg; 24044b816f17SAbhishek Ambure struct mgmt_tx_compl_params param; 2405dc405152SRakesh Pillai int ret; 2406dc405152SRakesh Pillai 2407dc405152SRakesh Pillai ret = ath10k_wmi_pull_mgmt_tx_compl(ar, skb, &arg); 2408dc405152SRakesh Pillai if (ret) { 2409dc405152SRakesh Pillai ath10k_warn(ar, "failed to parse mgmt comp event: %d\n", ret); 2410dc405152SRakesh Pillai return ret; 2411dc405152SRakesh Pillai } 2412dc405152SRakesh Pillai 24134b816f17SAbhishek Ambure memset(¶m, 0, sizeof(struct mgmt_tx_compl_params)); 24144b816f17SAbhishek Ambure param.desc_id = __le32_to_cpu(arg.desc_id); 24154b816f17SAbhishek Ambure param.status = __le32_to_cpu(arg.status); 24164b816f17SAbhishek Ambure 24174b816f17SAbhishek Ambure if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map)) 24184b816f17SAbhishek Ambure param.ack_rssi = __le32_to_cpu(arg.ack_rssi); 24194b816f17SAbhishek Ambure 24204b816f17SAbhishek Ambure wmi_process_mgmt_tx_comp(ar, ¶m); 2421dc405152SRakesh Pillai 2422dc405152SRakesh Pillai ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv evnt mgmt tx completion\n"); 2423dc405152SRakesh Pillai 2424dc405152SRakesh Pillai return 0; 2425dc405152SRakesh Pillai } 2426dc405152SRakesh Pillai 2427cc123facSRakesh Pillai int ath10k_wmi_event_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb) 2428cc123facSRakesh Pillai { 2429cc123facSRakesh Pillai struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg arg; 24304b816f17SAbhishek Ambure struct mgmt_tx_compl_params param; 2431cc123facSRakesh Pillai u32 num_reports; 2432cc123facSRakesh Pillai int i, ret; 2433cc123facSRakesh Pillai 2434cc123facSRakesh Pillai ret = ath10k_wmi_pull_mgmt_tx_bundle_compl(ar, skb, &arg); 2435cc123facSRakesh Pillai if (ret) { 2436cc123facSRakesh Pillai ath10k_warn(ar, "failed to parse bundle mgmt compl event: %d\n", ret); 2437cc123facSRakesh Pillai return ret; 2438cc123facSRakesh Pillai } 2439cc123facSRakesh Pillai 2440cc123facSRakesh Pillai num_reports = __le32_to_cpu(arg.num_reports); 2441cc123facSRakesh Pillai 24424b816f17SAbhishek Ambure for (i = 0; i < num_reports; i++) { 24434b816f17SAbhishek Ambure memset(¶m, 0, sizeof(struct mgmt_tx_compl_params)); 24444b816f17SAbhishek Ambure param.desc_id = __le32_to_cpu(arg.desc_ids[i]); 24454b816f17SAbhishek Ambure param.status = __le32_to_cpu(arg.desc_ids[i]); 24464b816f17SAbhishek Ambure 24474b816f17SAbhishek Ambure if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map)) 24484b816f17SAbhishek Ambure param.ack_rssi = __le32_to_cpu(arg.ack_rssi[i]); 24494b816f17SAbhishek Ambure wmi_process_mgmt_tx_comp(ar, ¶m); 24504b816f17SAbhishek Ambure } 2451cc123facSRakesh Pillai 2452cc123facSRakesh Pillai ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv event bundle mgmt tx completion\n"); 2453cc123facSRakesh Pillai 2454cc123facSRakesh Pillai return 0; 2455cc123facSRakesh Pillai } 2456cc123facSRakesh Pillai 24570226d602SMichal Kazior int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb) 245832653cf1SMichal Kazior { 245932653cf1SMichal Kazior struct wmi_mgmt_rx_ev_arg arg = {}; 246032653cf1SMichal Kazior struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 246132653cf1SMichal Kazior struct ieee80211_hdr *hdr; 246201cebe1cSMichal Kazior struct ieee80211_supported_band *sband; 246332653cf1SMichal Kazior u32 rx_status; 246432653cf1SMichal Kazior u32 channel; 246532653cf1SMichal Kazior u32 phy_mode; 246632653cf1SMichal Kazior u32 snr; 246732653cf1SMichal Kazior u32 rate; 246832653cf1SMichal Kazior u16 fc; 246932653cf1SMichal Kazior int ret; 247032653cf1SMichal Kazior 2471d7579d12SMichal Kazior ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg); 247232653cf1SMichal Kazior if (ret) { 247332653cf1SMichal Kazior ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret); 247408603f2eSRaja Mani dev_kfree_skb(skb); 247532653cf1SMichal Kazior return ret; 247632653cf1SMichal Kazior } 247732653cf1SMichal Kazior 247832653cf1SMichal Kazior channel = __le32_to_cpu(arg.channel); 247932653cf1SMichal Kazior rx_status = __le32_to_cpu(arg.status); 248032653cf1SMichal Kazior snr = __le32_to_cpu(arg.snr); 248132653cf1SMichal Kazior phy_mode = __le32_to_cpu(arg.phy_mode); 248232653cf1SMichal Kazior rate = __le32_to_cpu(arg.rate); 24835e3dd157SKalle Valo 24845e3dd157SKalle Valo memset(status, 0, sizeof(*status)); 24855e3dd157SKalle Valo 24867aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 24875e3dd157SKalle Valo "event mgmt rx status %08x\n", rx_status); 24885e3dd157SKalle Valo 24892c9bceceSManikanta Pubbisetty if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) || 24902c9bceceSManikanta Pubbisetty (rx_status & (WMI_RX_STATUS_ERR_DECRYPT | 24912c9bceceSManikanta Pubbisetty WMI_RX_STATUS_ERR_KEY_CACHE_MISS | WMI_RX_STATUS_ERR_CRC))) { 2492d67d0a02SMichal Kazior dev_kfree_skb(skb); 2493d67d0a02SMichal Kazior return 0; 2494d67d0a02SMichal Kazior } 2495d67d0a02SMichal Kazior 24965e3dd157SKalle Valo if (rx_status & WMI_RX_STATUS_ERR_MIC) 24975e3dd157SKalle Valo status->flag |= RX_FLAG_MMIC_ERROR; 24985e3dd157SKalle Valo 24998d130963SPeter Oh if (rx_status & WMI_RX_STATUS_EXT_INFO) { 25008d130963SPeter Oh status->mactime = 25018d130963SPeter Oh __le64_to_cpu(arg.ext_info.rx_mac_timestamp); 25028d130963SPeter Oh status->flag |= RX_FLAG_MACTIME_END; 25038d130963SPeter Oh } 250421040bf9SMichal Kazior /* Hardware can Rx CCK rates on 5GHz. In that case phy_mode is set to 2505453cdb61SMichal Kazior * MODE_11B. This means phy_mode is not a reliable source for the band 250621040bf9SMichal Kazior * of mgmt rx. 250721040bf9SMichal Kazior */ 250821040bf9SMichal Kazior if (channel >= 1 && channel <= 14) { 250957fbcce3SJohannes Berg status->band = NL80211_BAND_2GHZ; 251038441fb6SBen Greear } else if (channel >= 36 && channel <= ATH10K_MAX_5G_CHAN) { 251157fbcce3SJohannes Berg status->band = NL80211_BAND_5GHZ; 2512453cdb61SMichal Kazior } else { 251321040bf9SMichal Kazior /* Shouldn't happen unless list of advertised channels to 251421040bf9SMichal Kazior * mac80211 has been changed. 251521040bf9SMichal Kazior */ 251621040bf9SMichal Kazior WARN_ON_ONCE(1); 251721040bf9SMichal Kazior dev_kfree_skb(skb); 251821040bf9SMichal Kazior return 0; 2519453cdb61SMichal Kazior } 2520453cdb61SMichal Kazior 252157fbcce3SJohannes Berg if (phy_mode == MODE_11B && status->band == NL80211_BAND_5GHZ) 252221040bf9SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n"); 252321040bf9SMichal Kazior 252401cebe1cSMichal Kazior sband = &ar->mac.sbands[status->band]; 252501cebe1cSMichal Kazior 25265e3dd157SKalle Valo status->freq = ieee80211_channel_to_frequency(channel, status->band); 25275e3dd157SKalle Valo status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR; 252801cebe1cSMichal Kazior status->rate_idx = ath10k_mac_bitrate_to_idx(sband, rate / 100); 25295e3dd157SKalle Valo 25305e3dd157SKalle Valo hdr = (struct ieee80211_hdr *)skb->data; 25315e3dd157SKalle Valo fc = le16_to_cpu(hdr->frame_control); 25325e3dd157SKalle Valo 253360549cabSGrzegorz Bajorski /* Firmware is guaranteed to report all essential management frames via 253460549cabSGrzegorz Bajorski * WMI while it can deliver some extra via HTT. Since there can be 253560549cabSGrzegorz Bajorski * duplicates split the reporting wrt monitor/sniffing. 253660549cabSGrzegorz Bajorski */ 253760549cabSGrzegorz Bajorski status->flag |= RX_FLAG_SKIP_MONITOR; 253860549cabSGrzegorz Bajorski 2539504f6cdfSSujith Manoharan ath10k_wmi_handle_wep_reauth(ar, skb, status); 2540504f6cdfSSujith Manoharan 25417d42298eSRajkumar Manoharan if (ath10k_wmi_rx_is_decrypted(ar, hdr)) { 2542eeab266cSMarek Kwaczynski status->flag |= RX_FLAG_DECRYPTED; 2543eeab266cSMarek Kwaczynski 2544eeab266cSMarek Kwaczynski if (!ieee80211_is_action(hdr->frame_control) && 2545eeab266cSMarek Kwaczynski !ieee80211_is_deauth(hdr->frame_control) && 2546eeab266cSMarek Kwaczynski !ieee80211_is_disassoc(hdr->frame_control)) { 2547eeab266cSMarek Kwaczynski status->flag |= RX_FLAG_IV_STRIPPED | 25485e3dd157SKalle Valo RX_FLAG_MMIC_STRIPPED; 25495e3dd157SKalle Valo hdr->frame_control = __cpu_to_le16(fc & 25505e3dd157SKalle Valo ~IEEE80211_FCTL_PROTECTED); 25515e3dd157SKalle Valo } 2552eeab266cSMarek Kwaczynski } 25535e3dd157SKalle Valo 2554cc9904e6SMichal Kazior if (ieee80211_is_beacon(hdr->frame_control)) 2555cc9904e6SMichal Kazior ath10k_mac_handle_beacon(ar, skb); 2556cc9904e6SMichal Kazior 25577aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 255875b34800SMaharaja Kennadyrajan "event mgmt rx skb %pK len %d ftype %02x stype %02x\n", 25595e3dd157SKalle Valo skb, skb->len, 25605e3dd157SKalle Valo fc & IEEE80211_FCTL_FTYPE, fc & IEEE80211_FCTL_STYPE); 25615e3dd157SKalle Valo 25627aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 25635e3dd157SKalle Valo "event mgmt rx freq %d band %d snr %d, rate_idx %d\n", 25645e3dd157SKalle Valo status->freq, status->band, status->signal, 25655e3dd157SKalle Valo status->rate_idx); 25665e3dd157SKalle Valo 256737f62c0dSErik Stromdahl ieee80211_rx_ni(ar->hw, skb); 256837f62c0dSErik Stromdahl 25695e3dd157SKalle Valo return 0; 25705e3dd157SKalle Valo } 25715e3dd157SKalle Valo 25722e1dea40SMichal Kazior static int freq_to_idx(struct ath10k *ar, int freq) 25732e1dea40SMichal Kazior { 25742e1dea40SMichal Kazior struct ieee80211_supported_band *sband; 25752e1dea40SMichal Kazior int band, ch, idx = 0; 25762e1dea40SMichal Kazior 257757fbcce3SJohannes Berg for (band = NL80211_BAND_2GHZ; band < NUM_NL80211_BANDS; band++) { 25782e1dea40SMichal Kazior sband = ar->hw->wiphy->bands[band]; 25792e1dea40SMichal Kazior if (!sband) 25802e1dea40SMichal Kazior continue; 25812e1dea40SMichal Kazior 25822e1dea40SMichal Kazior for (ch = 0; ch < sband->n_channels; ch++, idx++) 25832e1dea40SMichal Kazior if (sband->channels[ch].center_freq == freq) 25842e1dea40SMichal Kazior goto exit; 25852e1dea40SMichal Kazior } 25862e1dea40SMichal Kazior 25872e1dea40SMichal Kazior exit: 25882e1dea40SMichal Kazior return idx; 25892e1dea40SMichal Kazior } 25902e1dea40SMichal Kazior 2591d7579d12SMichal Kazior static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb, 259232653cf1SMichal Kazior struct wmi_ch_info_ev_arg *arg) 259332653cf1SMichal Kazior { 259432653cf1SMichal Kazior struct wmi_chan_info_event *ev = (void *)skb->data; 259532653cf1SMichal Kazior 259632653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 259732653cf1SMichal Kazior return -EPROTO; 259832653cf1SMichal Kazior 259932653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 260032653cf1SMichal Kazior arg->err_code = ev->err_code; 260132653cf1SMichal Kazior arg->freq = ev->freq; 260232653cf1SMichal Kazior arg->cmd_flags = ev->cmd_flags; 260332653cf1SMichal Kazior arg->noise_floor = ev->noise_floor; 260432653cf1SMichal Kazior arg->rx_clear_count = ev->rx_clear_count; 260532653cf1SMichal Kazior arg->cycle_count = ev->cycle_count; 260632653cf1SMichal Kazior 260732653cf1SMichal Kazior return 0; 260832653cf1SMichal Kazior } 260932653cf1SMichal Kazior 2610b2297baaSRaja Mani static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k *ar, 2611b2297baaSRaja Mani struct sk_buff *skb, 2612b2297baaSRaja Mani struct wmi_ch_info_ev_arg *arg) 2613b2297baaSRaja Mani { 2614b2297baaSRaja Mani struct wmi_10_4_chan_info_event *ev = (void *)skb->data; 2615b2297baaSRaja Mani 2616b2297baaSRaja Mani if (skb->len < sizeof(*ev)) 2617b2297baaSRaja Mani return -EPROTO; 2618b2297baaSRaja Mani 2619b2297baaSRaja Mani skb_pull(skb, sizeof(*ev)); 2620b2297baaSRaja Mani arg->err_code = ev->err_code; 2621b2297baaSRaja Mani arg->freq = ev->freq; 2622b2297baaSRaja Mani arg->cmd_flags = ev->cmd_flags; 2623b2297baaSRaja Mani arg->noise_floor = ev->noise_floor; 2624b2297baaSRaja Mani arg->rx_clear_count = ev->rx_clear_count; 2625b2297baaSRaja Mani arg->cycle_count = ev->cycle_count; 2626b2297baaSRaja Mani arg->chan_tx_pwr_range = ev->chan_tx_pwr_range; 2627b2297baaSRaja Mani arg->chan_tx_pwr_tp = ev->chan_tx_pwr_tp; 2628b2297baaSRaja Mani arg->rx_frame_count = ev->rx_frame_count; 2629b2297baaSRaja Mani 2630b2297baaSRaja Mani return 0; 2631b2297baaSRaja Mani } 2632b2297baaSRaja Mani 263313104929SRakesh Pillai /* 263413104929SRakesh Pillai * Handle the channel info event for firmware which only sends one 263513104929SRakesh Pillai * chan_info event per scanned channel. 263613104929SRakesh Pillai */ 263713104929SRakesh Pillai static void ath10k_wmi_event_chan_info_unpaired(struct ath10k *ar, 263813104929SRakesh Pillai struct chan_info_params *params) 263913104929SRakesh Pillai { 264013104929SRakesh Pillai struct survey_info *survey; 264113104929SRakesh Pillai int idx; 264213104929SRakesh Pillai 264313104929SRakesh Pillai if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) { 264413104929SRakesh Pillai ath10k_dbg(ar, ATH10K_DBG_WMI, "chan info report completed\n"); 264513104929SRakesh Pillai return; 264613104929SRakesh Pillai } 264713104929SRakesh Pillai 264813104929SRakesh Pillai idx = freq_to_idx(ar, params->freq); 264913104929SRakesh Pillai if (idx >= ARRAY_SIZE(ar->survey)) { 265013104929SRakesh Pillai ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n", 265113104929SRakesh Pillai params->freq, idx); 265213104929SRakesh Pillai return; 265313104929SRakesh Pillai } 265413104929SRakesh Pillai 265513104929SRakesh Pillai survey = &ar->survey[idx]; 265613104929SRakesh Pillai 265727120f2aSDan Carpenter if (!params->mac_clk_mhz) 265813104929SRakesh Pillai return; 265913104929SRakesh Pillai 266013104929SRakesh Pillai memset(survey, 0, sizeof(*survey)); 266113104929SRakesh Pillai 266213104929SRakesh Pillai survey->noise = params->noise_floor; 266313104929SRakesh Pillai survey->time = (params->cycle_count / params->mac_clk_mhz) / 1000; 266413104929SRakesh Pillai survey->time_busy = (params->rx_clear_count / params->mac_clk_mhz) / 1000; 266513104929SRakesh Pillai survey->filled |= SURVEY_INFO_NOISE_DBM | SURVEY_INFO_TIME | 266613104929SRakesh Pillai SURVEY_INFO_TIME_BUSY; 266713104929SRakesh Pillai } 266813104929SRakesh Pillai 266913104929SRakesh Pillai /* 267013104929SRakesh Pillai * Handle the channel info event for firmware which sends chan_info 267113104929SRakesh Pillai * event in pairs(start and stop events) for every scanned channel. 267213104929SRakesh Pillai */ 267313104929SRakesh Pillai static void ath10k_wmi_event_chan_info_paired(struct ath10k *ar, 267413104929SRakesh Pillai struct chan_info_params *params) 267513104929SRakesh Pillai { 267613104929SRakesh Pillai struct survey_info *survey; 267713104929SRakesh Pillai int idx; 267813104929SRakesh Pillai 267913104929SRakesh Pillai idx = freq_to_idx(ar, params->freq); 268013104929SRakesh Pillai if (idx >= ARRAY_SIZE(ar->survey)) { 268113104929SRakesh Pillai ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n", 268213104929SRakesh Pillai params->freq, idx); 268313104929SRakesh Pillai return; 268413104929SRakesh Pillai } 268513104929SRakesh Pillai 268613104929SRakesh Pillai if (params->cmd_flags & WMI_CHAN_INFO_FLAG_COMPLETE) { 268713104929SRakesh Pillai if (ar->ch_info_can_report_survey) { 268813104929SRakesh Pillai survey = &ar->survey[idx]; 268913104929SRakesh Pillai survey->noise = params->noise_floor; 269013104929SRakesh Pillai survey->filled = SURVEY_INFO_NOISE_DBM; 269113104929SRakesh Pillai 269213104929SRakesh Pillai ath10k_hw_fill_survey_time(ar, 269313104929SRakesh Pillai survey, 269413104929SRakesh Pillai params->cycle_count, 269513104929SRakesh Pillai params->rx_clear_count, 269613104929SRakesh Pillai ar->survey_last_cycle_count, 269713104929SRakesh Pillai ar->survey_last_rx_clear_count); 269813104929SRakesh Pillai } 269913104929SRakesh Pillai 270013104929SRakesh Pillai ar->ch_info_can_report_survey = false; 270113104929SRakesh Pillai } else { 270213104929SRakesh Pillai ar->ch_info_can_report_survey = true; 270313104929SRakesh Pillai } 270413104929SRakesh Pillai 270513104929SRakesh Pillai if (!(params->cmd_flags & WMI_CHAN_INFO_FLAG_PRE_COMPLETE)) { 270613104929SRakesh Pillai ar->survey_last_rx_clear_count = params->rx_clear_count; 270713104929SRakesh Pillai ar->survey_last_cycle_count = params->cycle_count; 270813104929SRakesh Pillai } 270913104929SRakesh Pillai } 271013104929SRakesh Pillai 27110226d602SMichal Kazior void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb) 27125e3dd157SKalle Valo { 271313104929SRakesh Pillai struct chan_info_params ch_info_param; 271432653cf1SMichal Kazior struct wmi_ch_info_ev_arg arg = {}; 271513104929SRakesh Pillai int ret; 27162e1dea40SMichal Kazior 2717d7579d12SMichal Kazior ret = ath10k_wmi_pull_ch_info(ar, skb, &arg); 271832653cf1SMichal Kazior if (ret) { 271932653cf1SMichal Kazior ath10k_warn(ar, "failed to parse chan info event: %d\n", ret); 272032653cf1SMichal Kazior return; 272132653cf1SMichal Kazior } 27222e1dea40SMichal Kazior 272313104929SRakesh Pillai ch_info_param.err_code = __le32_to_cpu(arg.err_code); 272413104929SRakesh Pillai ch_info_param.freq = __le32_to_cpu(arg.freq); 272513104929SRakesh Pillai ch_info_param.cmd_flags = __le32_to_cpu(arg.cmd_flags); 272613104929SRakesh Pillai ch_info_param.noise_floor = __le32_to_cpu(arg.noise_floor); 272713104929SRakesh Pillai ch_info_param.rx_clear_count = __le32_to_cpu(arg.rx_clear_count); 272813104929SRakesh Pillai ch_info_param.cycle_count = __le32_to_cpu(arg.cycle_count); 272913104929SRakesh Pillai ch_info_param.mac_clk_mhz = __le32_to_cpu(arg.mac_clk_mhz); 27302e1dea40SMichal Kazior 27317aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 27322e1dea40SMichal Kazior "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n", 273313104929SRakesh Pillai ch_info_param.err_code, ch_info_param.freq, ch_info_param.cmd_flags, 273413104929SRakesh Pillai ch_info_param.noise_floor, ch_info_param.rx_clear_count, 273513104929SRakesh Pillai ch_info_param.cycle_count); 27362e1dea40SMichal Kazior 27372e1dea40SMichal Kazior spin_lock_bh(&ar->data_lock); 27382e1dea40SMichal Kazior 27395c81c7fdSMichal Kazior switch (ar->scan.state) { 27405c81c7fdSMichal Kazior case ATH10K_SCAN_IDLE: 27415c81c7fdSMichal Kazior case ATH10K_SCAN_STARTING: 27427aa7a72aSMichal Kazior ath10k_warn(ar, "received chan info event without a scan request, ignoring\n"); 27432e1dea40SMichal Kazior goto exit; 27445c81c7fdSMichal Kazior case ATH10K_SCAN_RUNNING: 27455c81c7fdSMichal Kazior case ATH10K_SCAN_ABORTING: 27465c81c7fdSMichal Kazior break; 27472e1dea40SMichal Kazior } 27482e1dea40SMichal Kazior 274913104929SRakesh Pillai if (test_bit(ATH10K_FW_FEATURE_SINGLE_CHAN_INFO_PER_CHANNEL, 275013104929SRakesh Pillai ar->running_fw->fw_file.fw_features)) 275113104929SRakesh Pillai ath10k_wmi_event_chan_info_unpaired(ar, &ch_info_param); 275213104929SRakesh Pillai else 275313104929SRakesh Pillai ath10k_wmi_event_chan_info_paired(ar, &ch_info_param); 27542e1dea40SMichal Kazior 27552e1dea40SMichal Kazior exit: 27562e1dea40SMichal Kazior spin_unlock_bh(&ar->data_lock); 27575e3dd157SKalle Valo } 27585e3dd157SKalle Valo 27590226d602SMichal Kazior void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb) 27605e3dd157SKalle Valo { 276184d4911bSMichal Kazior struct wmi_echo_ev_arg arg = {}; 276284d4911bSMichal Kazior int ret; 276384d4911bSMichal Kazior 276484d4911bSMichal Kazior ret = ath10k_wmi_pull_echo_ev(ar, skb, &arg); 276584d4911bSMichal Kazior if (ret) { 276684d4911bSMichal Kazior ath10k_warn(ar, "failed to parse echo: %d\n", ret); 276784d4911bSMichal Kazior return; 276884d4911bSMichal Kazior } 276984d4911bSMichal Kazior 277084d4911bSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 277184d4911bSMichal Kazior "wmi event echo value 0x%08x\n", 277284d4911bSMichal Kazior le32_to_cpu(arg.value)); 277320ddca21SMichal Kazior 277420ddca21SMichal Kazior if (le32_to_cpu(arg.value) == ATH10K_WMI_BARRIER_ECHO_ID) 277520ddca21SMichal Kazior complete(&ar->wmi.barrier); 27765e3dd157SKalle Valo } 27775e3dd157SKalle Valo 27780226d602SMichal Kazior int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb) 27795e3dd157SKalle Valo { 27807aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n", 2781869526b9SKalle Valo skb->len); 2782869526b9SKalle Valo 2783d35a6c18SMichal Kazior trace_ath10k_wmi_dbglog(ar, skb->data, skb->len); 2784869526b9SKalle Valo 2785869526b9SKalle Valo return 0; 27865e3dd157SKalle Valo } 27875e3dd157SKalle Valo 2788b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_base(const struct wmi_pdev_stats_base *src, 27895326849aSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2790d15fb520SMichal Kazior { 2791d15fb520SMichal Kazior dst->ch_noise_floor = __le32_to_cpu(src->chan_nf); 2792d15fb520SMichal Kazior dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count); 2793d15fb520SMichal Kazior dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count); 2794d15fb520SMichal Kazior dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count); 2795d15fb520SMichal Kazior dst->cycle_count = __le32_to_cpu(src->cycle_count); 2796d15fb520SMichal Kazior dst->phy_err_count = __le32_to_cpu(src->phy_err_count); 2797d15fb520SMichal Kazior dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr); 2798b91251fbSMichal Kazior } 2799d15fb520SMichal Kazior 2800b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_tx(const struct wmi_pdev_stats_tx *src, 2801b91251fbSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2802b91251fbSMichal Kazior { 2803b91251fbSMichal Kazior dst->comp_queued = __le32_to_cpu(src->comp_queued); 2804b91251fbSMichal Kazior dst->comp_delivered = __le32_to_cpu(src->comp_delivered); 2805b91251fbSMichal Kazior dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued); 2806b91251fbSMichal Kazior dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued); 2807b91251fbSMichal Kazior dst->wmm_drop = __le32_to_cpu(src->wmm_drop); 2808b91251fbSMichal Kazior dst->local_enqued = __le32_to_cpu(src->local_enqued); 2809b91251fbSMichal Kazior dst->local_freed = __le32_to_cpu(src->local_freed); 2810b91251fbSMichal Kazior dst->hw_queued = __le32_to_cpu(src->hw_queued); 2811b91251fbSMichal Kazior dst->hw_reaped = __le32_to_cpu(src->hw_reaped); 2812b91251fbSMichal Kazior dst->underrun = __le32_to_cpu(src->underrun); 2813b91251fbSMichal Kazior dst->tx_abort = __le32_to_cpu(src->tx_abort); 2814b91251fbSMichal Kazior dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed); 2815b91251fbSMichal Kazior dst->tx_ko = __le32_to_cpu(src->tx_ko); 2816b91251fbSMichal Kazior dst->data_rc = __le32_to_cpu(src->data_rc); 2817b91251fbSMichal Kazior dst->self_triggers = __le32_to_cpu(src->self_triggers); 2818b91251fbSMichal Kazior dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure); 2819b91251fbSMichal Kazior dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err); 2820b91251fbSMichal Kazior dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry); 2821b91251fbSMichal Kazior dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout); 2822b91251fbSMichal Kazior dst->pdev_resets = __le32_to_cpu(src->pdev_resets); 2823b91251fbSMichal Kazior dst->phy_underrun = __le32_to_cpu(src->phy_underrun); 2824b91251fbSMichal Kazior dst->txop_ovf = __le32_to_cpu(src->txop_ovf); 2825b91251fbSMichal Kazior } 2826d15fb520SMichal Kazior 282798dd2b92SManikanta Pubbisetty static void 282898dd2b92SManikanta Pubbisetty ath10k_wmi_10_4_pull_pdev_stats_tx(const struct wmi_10_4_pdev_stats_tx *src, 282998dd2b92SManikanta Pubbisetty struct ath10k_fw_stats_pdev *dst) 283098dd2b92SManikanta Pubbisetty { 283198dd2b92SManikanta Pubbisetty dst->comp_queued = __le32_to_cpu(src->comp_queued); 283298dd2b92SManikanta Pubbisetty dst->comp_delivered = __le32_to_cpu(src->comp_delivered); 283398dd2b92SManikanta Pubbisetty dst->msdu_enqued = __le32_to_cpu(src->msdu_enqued); 283498dd2b92SManikanta Pubbisetty dst->mpdu_enqued = __le32_to_cpu(src->mpdu_enqued); 283598dd2b92SManikanta Pubbisetty dst->wmm_drop = __le32_to_cpu(src->wmm_drop); 283698dd2b92SManikanta Pubbisetty dst->local_enqued = __le32_to_cpu(src->local_enqued); 283798dd2b92SManikanta Pubbisetty dst->local_freed = __le32_to_cpu(src->local_freed); 283898dd2b92SManikanta Pubbisetty dst->hw_queued = __le32_to_cpu(src->hw_queued); 283998dd2b92SManikanta Pubbisetty dst->hw_reaped = __le32_to_cpu(src->hw_reaped); 284098dd2b92SManikanta Pubbisetty dst->underrun = __le32_to_cpu(src->underrun); 284198dd2b92SManikanta Pubbisetty dst->tx_abort = __le32_to_cpu(src->tx_abort); 284298dd2b92SManikanta Pubbisetty dst->mpdus_requed = __le32_to_cpu(src->mpdus_requed); 284398dd2b92SManikanta Pubbisetty dst->tx_ko = __le32_to_cpu(src->tx_ko); 284498dd2b92SManikanta Pubbisetty dst->data_rc = __le32_to_cpu(src->data_rc); 284598dd2b92SManikanta Pubbisetty dst->self_triggers = __le32_to_cpu(src->self_triggers); 284698dd2b92SManikanta Pubbisetty dst->sw_retry_failure = __le32_to_cpu(src->sw_retry_failure); 284798dd2b92SManikanta Pubbisetty dst->illgl_rate_phy_err = __le32_to_cpu(src->illgl_rate_phy_err); 284898dd2b92SManikanta Pubbisetty dst->pdev_cont_xretry = __le32_to_cpu(src->pdev_cont_xretry); 284998dd2b92SManikanta Pubbisetty dst->pdev_tx_timeout = __le32_to_cpu(src->pdev_tx_timeout); 285098dd2b92SManikanta Pubbisetty dst->pdev_resets = __le32_to_cpu(src->pdev_resets); 285198dd2b92SManikanta Pubbisetty dst->phy_underrun = __le32_to_cpu(src->phy_underrun); 285298dd2b92SManikanta Pubbisetty dst->txop_ovf = __le32_to_cpu(src->txop_ovf); 285398dd2b92SManikanta Pubbisetty dst->hw_paused = __le32_to_cpu(src->hw_paused); 285498dd2b92SManikanta Pubbisetty dst->seq_posted = __le32_to_cpu(src->seq_posted); 285598dd2b92SManikanta Pubbisetty dst->seq_failed_queueing = 285698dd2b92SManikanta Pubbisetty __le32_to_cpu(src->seq_failed_queueing); 285798dd2b92SManikanta Pubbisetty dst->seq_completed = __le32_to_cpu(src->seq_completed); 285898dd2b92SManikanta Pubbisetty dst->seq_restarted = __le32_to_cpu(src->seq_restarted); 285998dd2b92SManikanta Pubbisetty dst->mu_seq_posted = __le32_to_cpu(src->mu_seq_posted); 286098dd2b92SManikanta Pubbisetty dst->mpdus_sw_flush = __le32_to_cpu(src->mpdus_sw_flush); 286198dd2b92SManikanta Pubbisetty dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter); 286298dd2b92SManikanta Pubbisetty dst->mpdus_truncated = __le32_to_cpu(src->mpdus_truncated); 286398dd2b92SManikanta Pubbisetty dst->mpdus_ack_failed = __le32_to_cpu(src->mpdus_ack_failed); 286498dd2b92SManikanta Pubbisetty dst->mpdus_hw_filter = __le32_to_cpu(src->mpdus_hw_filter); 286598dd2b92SManikanta Pubbisetty dst->mpdus_expired = __le32_to_cpu(src->mpdus_expired); 286698dd2b92SManikanta Pubbisetty } 286798dd2b92SManikanta Pubbisetty 2868b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_rx(const struct wmi_pdev_stats_rx *src, 2869b91251fbSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2870b91251fbSMichal Kazior { 2871b91251fbSMichal Kazior dst->mid_ppdu_route_change = __le32_to_cpu(src->mid_ppdu_route_change); 2872b91251fbSMichal Kazior dst->status_rcvd = __le32_to_cpu(src->status_rcvd); 2873b91251fbSMichal Kazior dst->r0_frags = __le32_to_cpu(src->r0_frags); 2874b91251fbSMichal Kazior dst->r1_frags = __le32_to_cpu(src->r1_frags); 2875b91251fbSMichal Kazior dst->r2_frags = __le32_to_cpu(src->r2_frags); 2876b91251fbSMichal Kazior dst->r3_frags = __le32_to_cpu(src->r3_frags); 2877b91251fbSMichal Kazior dst->htt_msdus = __le32_to_cpu(src->htt_msdus); 2878b91251fbSMichal Kazior dst->htt_mpdus = __le32_to_cpu(src->htt_mpdus); 2879b91251fbSMichal Kazior dst->loc_msdus = __le32_to_cpu(src->loc_msdus); 2880b91251fbSMichal Kazior dst->loc_mpdus = __le32_to_cpu(src->loc_mpdus); 2881b91251fbSMichal Kazior dst->oversize_amsdu = __le32_to_cpu(src->oversize_amsdu); 2882b91251fbSMichal Kazior dst->phy_errs = __le32_to_cpu(src->phy_errs); 2883b91251fbSMichal Kazior dst->phy_err_drop = __le32_to_cpu(src->phy_err_drop); 2884b91251fbSMichal Kazior dst->mpdu_errs = __le32_to_cpu(src->mpdu_errs); 2885b91251fbSMichal Kazior } 2886b91251fbSMichal Kazior 2887b91251fbSMichal Kazior void ath10k_wmi_pull_pdev_stats_extra(const struct wmi_pdev_stats_extra *src, 2888b91251fbSMichal Kazior struct ath10k_fw_stats_pdev *dst) 2889b91251fbSMichal Kazior { 2890b91251fbSMichal Kazior dst->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad); 2891b91251fbSMichal Kazior dst->rts_bad = __le32_to_cpu(src->rts_bad); 2892b91251fbSMichal Kazior dst->rts_good = __le32_to_cpu(src->rts_good); 2893b91251fbSMichal Kazior dst->fcs_bad = __le32_to_cpu(src->fcs_bad); 2894b91251fbSMichal Kazior dst->no_beacons = __le32_to_cpu(src->no_beacons); 2895b91251fbSMichal Kazior dst->mib_int_count = __le32_to_cpu(src->mib_int_count); 2896d15fb520SMichal Kazior } 2897d15fb520SMichal Kazior 28980226d602SMichal Kazior void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src, 289960ef401aSMichal Kazior struct ath10k_fw_stats_peer *dst) 2900d15fb520SMichal Kazior { 2901d15fb520SMichal Kazior ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr); 2902d15fb520SMichal Kazior dst->peer_rssi = __le32_to_cpu(src->peer_rssi); 2903d15fb520SMichal Kazior dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate); 2904d15fb520SMichal Kazior } 2905d15fb520SMichal Kazior 2906f9575793SMohammed Shafi Shajakhan static void 2907f9575793SMohammed Shafi Shajakhan ath10k_wmi_10_4_pull_peer_stats(const struct wmi_10_4_peer_stats *src, 2908f9575793SMohammed Shafi Shajakhan struct ath10k_fw_stats_peer *dst) 2909f9575793SMohammed Shafi Shajakhan { 2910f9575793SMohammed Shafi Shajakhan ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr); 2911f9575793SMohammed Shafi Shajakhan dst->peer_rssi = __le32_to_cpu(src->peer_rssi); 2912f9575793SMohammed Shafi Shajakhan dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate); 2913f9575793SMohammed Shafi Shajakhan dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 2914f9575793SMohammed Shafi Shajakhan } 2915f9575793SMohammed Shafi Shajakhan 29161b3fdb50SRajkumar Manoharan static void 29171b3fdb50SRajkumar Manoharan ath10k_wmi_10_4_pull_vdev_stats(const struct wmi_vdev_stats_extd *src, 29181b3fdb50SRajkumar Manoharan struct ath10k_fw_stats_vdev_extd *dst) 29191b3fdb50SRajkumar Manoharan { 29201b3fdb50SRajkumar Manoharan dst->vdev_id = __le32_to_cpu(src->vdev_id); 29211b3fdb50SRajkumar Manoharan dst->ppdu_aggr_cnt = __le32_to_cpu(src->ppdu_aggr_cnt); 29221b3fdb50SRajkumar Manoharan dst->ppdu_noack = __le32_to_cpu(src->ppdu_noack); 29231b3fdb50SRajkumar Manoharan dst->mpdu_queued = __le32_to_cpu(src->mpdu_queued); 29241b3fdb50SRajkumar Manoharan dst->ppdu_nonaggr_cnt = __le32_to_cpu(src->ppdu_nonaggr_cnt); 29251b3fdb50SRajkumar Manoharan dst->mpdu_sw_requeued = __le32_to_cpu(src->mpdu_sw_requeued); 29261b3fdb50SRajkumar Manoharan dst->mpdu_suc_retry = __le32_to_cpu(src->mpdu_suc_retry); 29271b3fdb50SRajkumar Manoharan dst->mpdu_suc_multitry = __le32_to_cpu(src->mpdu_suc_multitry); 29281b3fdb50SRajkumar Manoharan dst->mpdu_fail_retry = __le32_to_cpu(src->mpdu_fail_retry); 29291b3fdb50SRajkumar Manoharan dst->tx_ftm_suc = __le32_to_cpu(src->tx_ftm_suc); 29301b3fdb50SRajkumar Manoharan dst->tx_ftm_suc_retry = __le32_to_cpu(src->tx_ftm_suc_retry); 29311b3fdb50SRajkumar Manoharan dst->tx_ftm_fail = __le32_to_cpu(src->tx_ftm_fail); 29321b3fdb50SRajkumar Manoharan dst->rx_ftmr_cnt = __le32_to_cpu(src->rx_ftmr_cnt); 29331b3fdb50SRajkumar Manoharan dst->rx_ftmr_dup_cnt = __le32_to_cpu(src->rx_ftmr_dup_cnt); 29341b3fdb50SRajkumar Manoharan dst->rx_iftmr_cnt = __le32_to_cpu(src->rx_iftmr_cnt); 29351b3fdb50SRajkumar Manoharan dst->rx_iftmr_dup_cnt = __le32_to_cpu(src->rx_iftmr_dup_cnt); 29361b3fdb50SRajkumar Manoharan } 29371b3fdb50SRajkumar Manoharan 2938d7579d12SMichal Kazior static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar, 2939d15fb520SMichal Kazior struct sk_buff *skb, 294060ef401aSMichal Kazior struct ath10k_fw_stats *stats) 2941d15fb520SMichal Kazior { 2942d15fb520SMichal Kazior const struct wmi_stats_event *ev = (void *)skb->data; 29433e2740cdSKenneth Lu u32 num_pdev_stats, num_peer_stats; 2944d15fb520SMichal Kazior int i; 2945d15fb520SMichal Kazior 2946d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 2947d15fb520SMichal Kazior return -EPROTO; 2948d15fb520SMichal Kazior 2949d15fb520SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 2950d15fb520SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 2951d15fb520SMichal Kazior 29525326849aSMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 2953d15fb520SMichal Kazior const struct wmi_pdev_stats *src; 29545326849aSMichal Kazior struct ath10k_fw_stats_pdev *dst; 2955d15fb520SMichal Kazior 2956d15fb520SMichal Kazior src = (void *)skb->data; 2957d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 2958d15fb520SMichal Kazior return -EPROTO; 2959d15fb520SMichal Kazior 29605326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 29615326849aSMichal Kazior if (!dst) 29625326849aSMichal Kazior continue; 29635326849aSMichal Kazior 2964b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 2965b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 2966b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 2967b91251fbSMichal Kazior 29685326849aSMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 2969d15fb520SMichal Kazior } 2970d15fb520SMichal Kazior 2971d15fb520SMichal Kazior /* fw doesn't implement vdev stats */ 2972d15fb520SMichal Kazior 2973d15fb520SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 2974d15fb520SMichal Kazior const struct wmi_peer_stats *src; 29755326849aSMichal Kazior struct ath10k_fw_stats_peer *dst; 2976d15fb520SMichal Kazior 2977d15fb520SMichal Kazior src = (void *)skb->data; 2978d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 2979d15fb520SMichal Kazior return -EPROTO; 2980d15fb520SMichal Kazior 29815326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 29825326849aSMichal Kazior if (!dst) 29835326849aSMichal Kazior continue; 29845326849aSMichal Kazior 29855326849aSMichal Kazior ath10k_wmi_pull_peer_stats(src, dst); 29865326849aSMichal Kazior list_add_tail(&dst->list, &stats->peers); 2987d15fb520SMichal Kazior } 2988d15fb520SMichal Kazior 2989d15fb520SMichal Kazior return 0; 2990d15fb520SMichal Kazior } 2991d15fb520SMichal Kazior 2992d7579d12SMichal Kazior static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar, 2993d15fb520SMichal Kazior struct sk_buff *skb, 299460ef401aSMichal Kazior struct ath10k_fw_stats *stats) 2995d15fb520SMichal Kazior { 2996d15fb520SMichal Kazior const struct wmi_stats_event *ev = (void *)skb->data; 29973e2740cdSKenneth Lu u32 num_pdev_stats, num_peer_stats; 2998d15fb520SMichal Kazior int i; 2999d15fb520SMichal Kazior 3000d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 3001d15fb520SMichal Kazior return -EPROTO; 3002d15fb520SMichal Kazior 3003d15fb520SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 3004d15fb520SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 3005d15fb520SMichal Kazior 30065326849aSMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 3007d15fb520SMichal Kazior const struct wmi_10x_pdev_stats *src; 30085326849aSMichal Kazior struct ath10k_fw_stats_pdev *dst; 3009d15fb520SMichal Kazior 3010d15fb520SMichal Kazior src = (void *)skb->data; 3011d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 3012d15fb520SMichal Kazior return -EPROTO; 3013d15fb520SMichal Kazior 30145326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 30155326849aSMichal Kazior if (!dst) 30165326849aSMichal Kazior continue; 3017d15fb520SMichal Kazior 3018b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 3019b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 3020b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 3021b91251fbSMichal Kazior ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 30225326849aSMichal Kazior 30235326849aSMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 3024d15fb520SMichal Kazior } 3025d15fb520SMichal Kazior 3026d15fb520SMichal Kazior /* fw doesn't implement vdev stats */ 3027d15fb520SMichal Kazior 3028d15fb520SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 3029d15fb520SMichal Kazior const struct wmi_10x_peer_stats *src; 30305326849aSMichal Kazior struct ath10k_fw_stats_peer *dst; 3031d15fb520SMichal Kazior 3032d15fb520SMichal Kazior src = (void *)skb->data; 3033d15fb520SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 3034d15fb520SMichal Kazior return -EPROTO; 3035d15fb520SMichal Kazior 30365326849aSMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 30375326849aSMichal Kazior if (!dst) 30385326849aSMichal Kazior continue; 3039d15fb520SMichal Kazior 30405326849aSMichal Kazior ath10k_wmi_pull_peer_stats(&src->old, dst); 30415326849aSMichal Kazior 30425326849aSMichal Kazior dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 30435326849aSMichal Kazior 30445326849aSMichal Kazior list_add_tail(&dst->list, &stats->peers); 3045d15fb520SMichal Kazior } 3046d15fb520SMichal Kazior 3047d15fb520SMichal Kazior return 0; 3048d15fb520SMichal Kazior } 3049d15fb520SMichal Kazior 305020de2229SMichal Kazior static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar, 305120de2229SMichal Kazior struct sk_buff *skb, 305220de2229SMichal Kazior struct ath10k_fw_stats *stats) 305320de2229SMichal Kazior { 305420de2229SMichal Kazior const struct wmi_10_2_stats_event *ev = (void *)skb->data; 305520de2229SMichal Kazior u32 num_pdev_stats; 305620de2229SMichal Kazior u32 num_pdev_ext_stats; 305720de2229SMichal Kazior u32 num_peer_stats; 305820de2229SMichal Kazior int i; 305920de2229SMichal Kazior 306020de2229SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 306120de2229SMichal Kazior return -EPROTO; 306220de2229SMichal Kazior 306320de2229SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 306420de2229SMichal Kazior num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 306520de2229SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 306620de2229SMichal Kazior 306720de2229SMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 306820de2229SMichal Kazior const struct wmi_10_2_pdev_stats *src; 306920de2229SMichal Kazior struct ath10k_fw_stats_pdev *dst; 307020de2229SMichal Kazior 307120de2229SMichal Kazior src = (void *)skb->data; 307220de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 307320de2229SMichal Kazior return -EPROTO; 307420de2229SMichal Kazior 307520de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 307620de2229SMichal Kazior if (!dst) 307720de2229SMichal Kazior continue; 307820de2229SMichal Kazior 307920de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 308020de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 308120de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 308220de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 308320de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 308420de2229SMichal Kazior 308520de2229SMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 308620de2229SMichal Kazior } 308720de2229SMichal Kazior 308820de2229SMichal Kazior for (i = 0; i < num_pdev_ext_stats; i++) { 308920de2229SMichal Kazior const struct wmi_10_2_pdev_ext_stats *src; 309020de2229SMichal Kazior 309120de2229SMichal Kazior src = (void *)skb->data; 309220de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 309320de2229SMichal Kazior return -EPROTO; 309420de2229SMichal Kazior 309520de2229SMichal Kazior /* FIXME: expose values to userspace 309620de2229SMichal Kazior * 309720de2229SMichal Kazior * Note: Even though this loop seems to do nothing it is 309820de2229SMichal Kazior * required to parse following sub-structures properly. 309920de2229SMichal Kazior */ 310020de2229SMichal Kazior } 310120de2229SMichal Kazior 310220de2229SMichal Kazior /* fw doesn't implement vdev stats */ 310320de2229SMichal Kazior 310420de2229SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 310520de2229SMichal Kazior const struct wmi_10_2_peer_stats *src; 310620de2229SMichal Kazior struct ath10k_fw_stats_peer *dst; 310720de2229SMichal Kazior 310820de2229SMichal Kazior src = (void *)skb->data; 310920de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 311020de2229SMichal Kazior return -EPROTO; 311120de2229SMichal Kazior 311220de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 311320de2229SMichal Kazior if (!dst) 311420de2229SMichal Kazior continue; 311520de2229SMichal Kazior 311620de2229SMichal Kazior ath10k_wmi_pull_peer_stats(&src->old, dst); 311720de2229SMichal Kazior 311820de2229SMichal Kazior dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate); 311920de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 312020de2229SMichal Kazior 312120de2229SMichal Kazior list_add_tail(&dst->list, &stats->peers); 312220de2229SMichal Kazior } 312320de2229SMichal Kazior 312420de2229SMichal Kazior return 0; 312520de2229SMichal Kazior } 312620de2229SMichal Kazior 312720de2229SMichal Kazior static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar, 312820de2229SMichal Kazior struct sk_buff *skb, 312920de2229SMichal Kazior struct ath10k_fw_stats *stats) 313020de2229SMichal Kazior { 313120de2229SMichal Kazior const struct wmi_10_2_stats_event *ev = (void *)skb->data; 313220de2229SMichal Kazior u32 num_pdev_stats; 313320de2229SMichal Kazior u32 num_pdev_ext_stats; 313420de2229SMichal Kazior u32 num_peer_stats; 313520de2229SMichal Kazior int i; 313620de2229SMichal Kazior 313720de2229SMichal Kazior if (!skb_pull(skb, sizeof(*ev))) 313820de2229SMichal Kazior return -EPROTO; 313920de2229SMichal Kazior 314020de2229SMichal Kazior num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 314120de2229SMichal Kazior num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 314220de2229SMichal Kazior num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 314320de2229SMichal Kazior 314420de2229SMichal Kazior for (i = 0; i < num_pdev_stats; i++) { 314520de2229SMichal Kazior const struct wmi_10_2_pdev_stats *src; 314620de2229SMichal Kazior struct ath10k_fw_stats_pdev *dst; 314720de2229SMichal Kazior 314820de2229SMichal Kazior src = (void *)skb->data; 314920de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 315020de2229SMichal Kazior return -EPROTO; 315120de2229SMichal Kazior 315220de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 315320de2229SMichal Kazior if (!dst) 315420de2229SMichal Kazior continue; 315520de2229SMichal Kazior 315620de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 315720de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst); 315820de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 315920de2229SMichal Kazior ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 316020de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 316120de2229SMichal Kazior 316220de2229SMichal Kazior list_add_tail(&dst->list, &stats->pdevs); 316320de2229SMichal Kazior } 316420de2229SMichal Kazior 316520de2229SMichal Kazior for (i = 0; i < num_pdev_ext_stats; i++) { 316620de2229SMichal Kazior const struct wmi_10_2_pdev_ext_stats *src; 316720de2229SMichal Kazior 316820de2229SMichal Kazior src = (void *)skb->data; 316920de2229SMichal Kazior if (!skb_pull(skb, sizeof(*src))) 317020de2229SMichal Kazior return -EPROTO; 317120de2229SMichal Kazior 317220de2229SMichal Kazior /* FIXME: expose values to userspace 317320de2229SMichal Kazior * 317420de2229SMichal Kazior * Note: Even though this loop seems to do nothing it is 317520de2229SMichal Kazior * required to parse following sub-structures properly. 317620de2229SMichal Kazior */ 317720de2229SMichal Kazior } 317820de2229SMichal Kazior 317920de2229SMichal Kazior /* fw doesn't implement vdev stats */ 318020de2229SMichal Kazior 318120de2229SMichal Kazior for (i = 0; i < num_peer_stats; i++) { 3182de46c015SMohammed Shafi Shajakhan const struct wmi_10_2_4_ext_peer_stats *src; 318320de2229SMichal Kazior struct ath10k_fw_stats_peer *dst; 3184de46c015SMohammed Shafi Shajakhan int stats_len; 3185de46c015SMohammed Shafi Shajakhan 3186cc61a1bbSMohammed Shafi Shajakhan if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map)) 3187de46c015SMohammed Shafi Shajakhan stats_len = sizeof(struct wmi_10_2_4_ext_peer_stats); 3188de46c015SMohammed Shafi Shajakhan else 3189de46c015SMohammed Shafi Shajakhan stats_len = sizeof(struct wmi_10_2_4_peer_stats); 319020de2229SMichal Kazior 319120de2229SMichal Kazior src = (void *)skb->data; 3192de46c015SMohammed Shafi Shajakhan if (!skb_pull(skb, stats_len)) 319320de2229SMichal Kazior return -EPROTO; 319420de2229SMichal Kazior 319520de2229SMichal Kazior dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 319620de2229SMichal Kazior if (!dst) 319720de2229SMichal Kazior continue; 319820de2229SMichal Kazior 319920de2229SMichal Kazior ath10k_wmi_pull_peer_stats(&src->common.old, dst); 320020de2229SMichal Kazior 320120de2229SMichal Kazior dst->peer_rx_rate = __le32_to_cpu(src->common.peer_rx_rate); 3202de46c015SMohammed Shafi Shajakhan 3203cc61a1bbSMohammed Shafi Shajakhan if (ath10k_peer_stats_enabled(ar)) 3204de46c015SMohammed Shafi Shajakhan dst->rx_duration = __le32_to_cpu(src->rx_duration); 320520de2229SMichal Kazior /* FIXME: expose 10.2 specific values */ 320620de2229SMichal Kazior 320720de2229SMichal Kazior list_add_tail(&dst->list, &stats->peers); 320820de2229SMichal Kazior } 320920de2229SMichal Kazior 321020de2229SMichal Kazior return 0; 321120de2229SMichal Kazior } 321220de2229SMichal Kazior 321398dd2b92SManikanta Pubbisetty static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar, 321498dd2b92SManikanta Pubbisetty struct sk_buff *skb, 321598dd2b92SManikanta Pubbisetty struct ath10k_fw_stats *stats) 321698dd2b92SManikanta Pubbisetty { 321798dd2b92SManikanta Pubbisetty const struct wmi_10_2_stats_event *ev = (void *)skb->data; 321898dd2b92SManikanta Pubbisetty u32 num_pdev_stats; 321998dd2b92SManikanta Pubbisetty u32 num_pdev_ext_stats; 322098dd2b92SManikanta Pubbisetty u32 num_vdev_stats; 322198dd2b92SManikanta Pubbisetty u32 num_peer_stats; 32224a49ae94SMohammed Shafi Shajakhan u32 num_bcnflt_stats; 3223f9575793SMohammed Shafi Shajakhan u32 stats_id; 322498dd2b92SManikanta Pubbisetty int i; 322598dd2b92SManikanta Pubbisetty 322698dd2b92SManikanta Pubbisetty if (!skb_pull(skb, sizeof(*ev))) 322798dd2b92SManikanta Pubbisetty return -EPROTO; 322898dd2b92SManikanta Pubbisetty 322998dd2b92SManikanta Pubbisetty num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 323098dd2b92SManikanta Pubbisetty num_pdev_ext_stats = __le32_to_cpu(ev->num_pdev_ext_stats); 323198dd2b92SManikanta Pubbisetty num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 323298dd2b92SManikanta Pubbisetty num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 32334a49ae94SMohammed Shafi Shajakhan num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats); 3234f9575793SMohammed Shafi Shajakhan stats_id = __le32_to_cpu(ev->stats_id); 323598dd2b92SManikanta Pubbisetty 323698dd2b92SManikanta Pubbisetty for (i = 0; i < num_pdev_stats; i++) { 323798dd2b92SManikanta Pubbisetty const struct wmi_10_4_pdev_stats *src; 323898dd2b92SManikanta Pubbisetty struct ath10k_fw_stats_pdev *dst; 323998dd2b92SManikanta Pubbisetty 324098dd2b92SManikanta Pubbisetty src = (void *)skb->data; 324198dd2b92SManikanta Pubbisetty if (!skb_pull(skb, sizeof(*src))) 324298dd2b92SManikanta Pubbisetty return -EPROTO; 324398dd2b92SManikanta Pubbisetty 324498dd2b92SManikanta Pubbisetty dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 324598dd2b92SManikanta Pubbisetty if (!dst) 324698dd2b92SManikanta Pubbisetty continue; 324798dd2b92SManikanta Pubbisetty 324898dd2b92SManikanta Pubbisetty ath10k_wmi_pull_pdev_stats_base(&src->base, dst); 324998dd2b92SManikanta Pubbisetty ath10k_wmi_10_4_pull_pdev_stats_tx(&src->tx, dst); 325098dd2b92SManikanta Pubbisetty ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst); 325198dd2b92SManikanta Pubbisetty dst->rx_ovfl_errs = __le32_to_cpu(src->rx_ovfl_errs); 325298dd2b92SManikanta Pubbisetty ath10k_wmi_pull_pdev_stats_extra(&src->extra, dst); 325398dd2b92SManikanta Pubbisetty 325498dd2b92SManikanta Pubbisetty list_add_tail(&dst->list, &stats->pdevs); 325598dd2b92SManikanta Pubbisetty } 325698dd2b92SManikanta Pubbisetty 325798dd2b92SManikanta Pubbisetty for (i = 0; i < num_pdev_ext_stats; i++) { 325898dd2b92SManikanta Pubbisetty const struct wmi_10_2_pdev_ext_stats *src; 325998dd2b92SManikanta Pubbisetty 326098dd2b92SManikanta Pubbisetty src = (void *)skb->data; 326198dd2b92SManikanta Pubbisetty if (!skb_pull(skb, sizeof(*src))) 326298dd2b92SManikanta Pubbisetty return -EPROTO; 326398dd2b92SManikanta Pubbisetty 326498dd2b92SManikanta Pubbisetty /* FIXME: expose values to userspace 326598dd2b92SManikanta Pubbisetty * 326698dd2b92SManikanta Pubbisetty * Note: Even though this loop seems to do nothing it is 326798dd2b92SManikanta Pubbisetty * required to parse following sub-structures properly. 326898dd2b92SManikanta Pubbisetty */ 326998dd2b92SManikanta Pubbisetty } 327098dd2b92SManikanta Pubbisetty 32711b3fdb50SRajkumar Manoharan for (i = 0; i < num_vdev_stats; i++) { 32721b3fdb50SRajkumar Manoharan const struct wmi_vdev_stats *src; 32731b3fdb50SRajkumar Manoharan 32741b3fdb50SRajkumar Manoharan /* Ignore vdev stats here as it has only vdev id. Actual vdev 32751b3fdb50SRajkumar Manoharan * stats will be retrieved from vdev extended stats. 32761b3fdb50SRajkumar Manoharan */ 32771b3fdb50SRajkumar Manoharan src = (void *)skb->data; 32781b3fdb50SRajkumar Manoharan if (!skb_pull(skb, sizeof(*src))) 32791b3fdb50SRajkumar Manoharan return -EPROTO; 32801b3fdb50SRajkumar Manoharan } 328198dd2b92SManikanta Pubbisetty 328298dd2b92SManikanta Pubbisetty for (i = 0; i < num_peer_stats; i++) { 32834a49ae94SMohammed Shafi Shajakhan const struct wmi_10_4_peer_stats *src; 328498dd2b92SManikanta Pubbisetty struct ath10k_fw_stats_peer *dst; 328598dd2b92SManikanta Pubbisetty 328698dd2b92SManikanta Pubbisetty src = (void *)skb->data; 32874a49ae94SMohammed Shafi Shajakhan if (!skb_pull(skb, sizeof(*src))) 328898dd2b92SManikanta Pubbisetty return -EPROTO; 328998dd2b92SManikanta Pubbisetty 329098dd2b92SManikanta Pubbisetty dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 329198dd2b92SManikanta Pubbisetty if (!dst) 329298dd2b92SManikanta Pubbisetty continue; 329398dd2b92SManikanta Pubbisetty 32944a49ae94SMohammed Shafi Shajakhan ath10k_wmi_10_4_pull_peer_stats(src, dst); 329598dd2b92SManikanta Pubbisetty list_add_tail(&dst->list, &stats->peers); 329698dd2b92SManikanta Pubbisetty } 329798dd2b92SManikanta Pubbisetty 32984a49ae94SMohammed Shafi Shajakhan for (i = 0; i < num_bcnflt_stats; i++) { 32994a49ae94SMohammed Shafi Shajakhan const struct wmi_10_4_bss_bcn_filter_stats *src; 33004a49ae94SMohammed Shafi Shajakhan 33014a49ae94SMohammed Shafi Shajakhan src = (void *)skb->data; 33024a49ae94SMohammed Shafi Shajakhan if (!skb_pull(skb, sizeof(*src))) 33034a49ae94SMohammed Shafi Shajakhan return -EPROTO; 33044a49ae94SMohammed Shafi Shajakhan 33054a49ae94SMohammed Shafi Shajakhan /* FIXME: expose values to userspace 33064a49ae94SMohammed Shafi Shajakhan * 33074a49ae94SMohammed Shafi Shajakhan * Note: Even though this loop seems to do nothing it is 33084a49ae94SMohammed Shafi Shajakhan * required to parse following sub-structures properly. 33094a49ae94SMohammed Shafi Shajakhan */ 33104a49ae94SMohammed Shafi Shajakhan } 33114a49ae94SMohammed Shafi Shajakhan 33121b3fdb50SRajkumar Manoharan if (stats_id & WMI_10_4_STAT_PEER_EXTD) { 33134a49ae94SMohammed Shafi Shajakhan stats->extended = true; 33144a49ae94SMohammed Shafi Shajakhan 33154a49ae94SMohammed Shafi Shajakhan for (i = 0; i < num_peer_stats; i++) { 33164a49ae94SMohammed Shafi Shajakhan const struct wmi_10_4_peer_extd_stats *src; 33174a49ae94SMohammed Shafi Shajakhan struct ath10k_fw_extd_stats_peer *dst; 33184a49ae94SMohammed Shafi Shajakhan 33194a49ae94SMohammed Shafi Shajakhan src = (void *)skb->data; 33204a49ae94SMohammed Shafi Shajakhan if (!skb_pull(skb, sizeof(*src))) 33214a49ae94SMohammed Shafi Shajakhan return -EPROTO; 33224a49ae94SMohammed Shafi Shajakhan 33234a49ae94SMohammed Shafi Shajakhan dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 33244a49ae94SMohammed Shafi Shajakhan if (!dst) 33254a49ae94SMohammed Shafi Shajakhan continue; 33264a49ae94SMohammed Shafi Shajakhan 33271b3fdb50SRajkumar Manoharan ether_addr_copy(dst->peer_macaddr, 33281b3fdb50SRajkumar Manoharan src->peer_macaddr.addr); 33294a49ae94SMohammed Shafi Shajakhan dst->rx_duration = __le32_to_cpu(src->rx_duration); 33304a49ae94SMohammed Shafi Shajakhan list_add_tail(&dst->list, &stats->peers_extd); 33314a49ae94SMohammed Shafi Shajakhan } 33321b3fdb50SRajkumar Manoharan } 33331b3fdb50SRajkumar Manoharan 33341b3fdb50SRajkumar Manoharan if (stats_id & WMI_10_4_STAT_VDEV_EXTD) { 33351b3fdb50SRajkumar Manoharan for (i = 0; i < num_vdev_stats; i++) { 33361b3fdb50SRajkumar Manoharan const struct wmi_vdev_stats_extd *src; 33371b3fdb50SRajkumar Manoharan struct ath10k_fw_stats_vdev_extd *dst; 33381b3fdb50SRajkumar Manoharan 33391b3fdb50SRajkumar Manoharan src = (void *)skb->data; 33401b3fdb50SRajkumar Manoharan if (!skb_pull(skb, sizeof(*src))) 33411b3fdb50SRajkumar Manoharan return -EPROTO; 33421b3fdb50SRajkumar Manoharan 33431b3fdb50SRajkumar Manoharan dst = kzalloc(sizeof(*dst), GFP_ATOMIC); 33441b3fdb50SRajkumar Manoharan if (!dst) 33451b3fdb50SRajkumar Manoharan continue; 33461b3fdb50SRajkumar Manoharan ath10k_wmi_10_4_pull_vdev_stats(src, dst); 33471b3fdb50SRajkumar Manoharan list_add_tail(&dst->list, &stats->vdevs); 33481b3fdb50SRajkumar Manoharan } 33491b3fdb50SRajkumar Manoharan } 33504a49ae94SMohammed Shafi Shajakhan 335198dd2b92SManikanta Pubbisetty return 0; 335298dd2b92SManikanta Pubbisetty } 335398dd2b92SManikanta Pubbisetty 33540226d602SMichal Kazior void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb) 33555e3dd157SKalle Valo { 33567aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n"); 335760ef401aSMichal Kazior ath10k_debug_fw_stats_process(ar, skb); 33585e3dd157SKalle Valo } 33595e3dd157SKalle Valo 3360d7579d12SMichal Kazior static int 3361d7579d12SMichal Kazior ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb, 336232653cf1SMichal Kazior struct wmi_vdev_start_ev_arg *arg) 336332653cf1SMichal Kazior { 336432653cf1SMichal Kazior struct wmi_vdev_start_response_event *ev = (void *)skb->data; 336532653cf1SMichal Kazior 336632653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 336732653cf1SMichal Kazior return -EPROTO; 336832653cf1SMichal Kazior 336932653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 337032653cf1SMichal Kazior arg->vdev_id = ev->vdev_id; 337132653cf1SMichal Kazior arg->req_id = ev->req_id; 337232653cf1SMichal Kazior arg->resp_type = ev->resp_type; 337332653cf1SMichal Kazior arg->status = ev->status; 337432653cf1SMichal Kazior 337532653cf1SMichal Kazior return 0; 337632653cf1SMichal Kazior } 337732653cf1SMichal Kazior 33780226d602SMichal Kazior void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb) 33795e3dd157SKalle Valo { 338032653cf1SMichal Kazior struct wmi_vdev_start_ev_arg arg = {}; 338132653cf1SMichal Kazior int ret; 3382833fd34dSBen Greear u32 status; 33835e3dd157SKalle Valo 33847aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n"); 33855e3dd157SKalle Valo 3386833fd34dSBen Greear ar->last_wmi_vdev_start_status = 0; 3387833fd34dSBen Greear 3388d7579d12SMichal Kazior ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg); 338932653cf1SMichal Kazior if (ret) { 339032653cf1SMichal Kazior ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret); 3391833fd34dSBen Greear ar->last_wmi_vdev_start_status = ret; 3392833fd34dSBen Greear goto out; 339332653cf1SMichal Kazior } 33945e3dd157SKalle Valo 3395833fd34dSBen Greear status = __le32_to_cpu(arg.status); 3396833fd34dSBen Greear if (WARN_ON_ONCE(status)) { 3397833fd34dSBen Greear ath10k_warn(ar, "vdev-start-response reports status error: %d (%s)\n", 3398833fd34dSBen Greear status, (status == WMI_VDEV_START_CHAN_INVALID) ? 3399833fd34dSBen Greear "chan-invalid" : "unknown"); 3400833fd34dSBen Greear /* Setup is done one way or another though, so we should still 3401833fd34dSBen Greear * do the completion, so don't return here. 3402833fd34dSBen Greear */ 3403833fd34dSBen Greear ar->last_wmi_vdev_start_status = -EINVAL; 3404833fd34dSBen Greear } 34055e3dd157SKalle Valo 3406833fd34dSBen Greear out: 34075e3dd157SKalle Valo complete(&ar->vdev_setup_done); 34085e3dd157SKalle Valo } 34095e3dd157SKalle Valo 34100226d602SMichal Kazior void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb) 34115e3dd157SKalle Valo { 34127aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n"); 34135e3dd157SKalle Valo complete(&ar->vdev_setup_done); 34145e3dd157SKalle Valo } 34155e3dd157SKalle Valo 3416d7579d12SMichal Kazior static int 3417d7579d12SMichal Kazior ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb, 341832653cf1SMichal Kazior struct wmi_peer_kick_ev_arg *arg) 341932653cf1SMichal Kazior { 342032653cf1SMichal Kazior struct wmi_peer_sta_kickout_event *ev = (void *)skb->data; 342132653cf1SMichal Kazior 342232653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 342332653cf1SMichal Kazior return -EPROTO; 342432653cf1SMichal Kazior 342532653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 342632653cf1SMichal Kazior arg->mac_addr = ev->peer_macaddr.addr; 342732653cf1SMichal Kazior 342832653cf1SMichal Kazior return 0; 342932653cf1SMichal Kazior } 343032653cf1SMichal Kazior 34310226d602SMichal Kazior void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb) 34325e3dd157SKalle Valo { 343332653cf1SMichal Kazior struct wmi_peer_kick_ev_arg arg = {}; 34345a13e76eSKalle Valo struct ieee80211_sta *sta; 343532653cf1SMichal Kazior int ret; 34365a13e76eSKalle Valo 3437d7579d12SMichal Kazior ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg); 343832653cf1SMichal Kazior if (ret) { 343932653cf1SMichal Kazior ath10k_warn(ar, "failed to parse peer kickout event: %d\n", 344032653cf1SMichal Kazior ret); 344132653cf1SMichal Kazior return; 344232653cf1SMichal Kazior } 34435a13e76eSKalle Valo 34447aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event peer sta kickout %pM\n", 344532653cf1SMichal Kazior arg.mac_addr); 34465a13e76eSKalle Valo 34475a13e76eSKalle Valo rcu_read_lock(); 34485a13e76eSKalle Valo 344932653cf1SMichal Kazior sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL); 34505a13e76eSKalle Valo if (!sta) { 34517aa7a72aSMichal Kazior ath10k_warn(ar, "Spurious quick kickout for STA %pM\n", 345232653cf1SMichal Kazior arg.mac_addr); 34535a13e76eSKalle Valo goto exit; 34545a13e76eSKalle Valo } 34555a13e76eSKalle Valo 34565a13e76eSKalle Valo ieee80211_report_low_ack(sta, 10); 34575a13e76eSKalle Valo 34585a13e76eSKalle Valo exit: 34595a13e76eSKalle Valo rcu_read_unlock(); 34605e3dd157SKalle Valo } 34615e3dd157SKalle Valo 34625e3dd157SKalle Valo /* 34635e3dd157SKalle Valo * FIXME 34645e3dd157SKalle Valo * 34655e3dd157SKalle Valo * We don't report to mac80211 sleep state of connected 34665e3dd157SKalle Valo * stations. Due to this mac80211 can't fill in TIM IE 34675e3dd157SKalle Valo * correctly. 34685e3dd157SKalle Valo * 34695e3dd157SKalle Valo * I know of no way of getting nullfunc frames that contain 34705e3dd157SKalle Valo * sleep transition from connected stations - these do not 34715e3dd157SKalle Valo * seem to be sent from the target to the host. There also 34725e3dd157SKalle Valo * doesn't seem to be a dedicated event for that. So the 34735e3dd157SKalle Valo * only way left to do this would be to read tim_bitmap 34745e3dd157SKalle Valo * during SWBA. 34755e3dd157SKalle Valo * 34765e3dd157SKalle Valo * We could probably try using tim_bitmap from SWBA to tell 34775e3dd157SKalle Valo * mac80211 which stations are asleep and which are not. The 34785e3dd157SKalle Valo * problem here is calling mac80211 functions so many times 34795e3dd157SKalle Valo * could take too long and make us miss the time to submit 34805e3dd157SKalle Valo * the beacon to the target. 34815e3dd157SKalle Valo * 34825e3dd157SKalle Valo * So as a workaround we try to extend the TIM IE if there 34835e3dd157SKalle Valo * is unicast buffered for stations with aid > 7 and fill it 34845e3dd157SKalle Valo * in ourselves. 34855e3dd157SKalle Valo */ 34865e3dd157SKalle Valo static void ath10k_wmi_update_tim(struct ath10k *ar, 34875e3dd157SKalle Valo struct ath10k_vif *arvif, 34885e3dd157SKalle Valo struct sk_buff *bcn, 3489a03fee34SRaja Mani const struct wmi_tim_info_arg *tim_info) 34905e3dd157SKalle Valo { 34915e3dd157SKalle Valo struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)bcn->data; 34925e3dd157SKalle Valo struct ieee80211_tim_ie *tim; 34935e3dd157SKalle Valo u8 *ies, *ie; 34945e3dd157SKalle Valo u8 ie_len, pvm_len; 3495af762c0bSKalle Valo __le32 t; 3496a03fee34SRaja Mani u32 v, tim_len; 3497a03fee34SRaja Mani 3498a03fee34SRaja Mani /* When FW reports 0 in tim_len, ensure atleast first byte 3499a03fee34SRaja Mani * in tim_bitmap is considered for pvm calculation. 3500a03fee34SRaja Mani */ 3501a03fee34SRaja Mani tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1; 35025e3dd157SKalle Valo 35035e3dd157SKalle Valo /* if next SWBA has no tim_changed the tim_bitmap is garbage. 3504d6dfe25cSMarcin Rokicki * we must copy the bitmap upon change and reuse it later 3505d6dfe25cSMarcin Rokicki */ 350632653cf1SMichal Kazior if (__le32_to_cpu(tim_info->tim_changed)) { 35075e3dd157SKalle Valo int i; 35085e3dd157SKalle Valo 3509a03fee34SRaja Mani if (sizeof(arvif->u.ap.tim_bitmap) < tim_len) { 3510a03fee34SRaja Mani ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu", 3511a03fee34SRaja Mani tim_len, sizeof(arvif->u.ap.tim_bitmap)); 3512a03fee34SRaja Mani tim_len = sizeof(arvif->u.ap.tim_bitmap); 3513a03fee34SRaja Mani } 35145e3dd157SKalle Valo 3515a03fee34SRaja Mani for (i = 0; i < tim_len; i++) { 351632653cf1SMichal Kazior t = tim_info->tim_bitmap[i / 4]; 3517af762c0bSKalle Valo v = __le32_to_cpu(t); 35185e3dd157SKalle Valo arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF; 35195e3dd157SKalle Valo } 35205e3dd157SKalle Valo 3521a03fee34SRaja Mani /* FW reports either length 0 or length based on max supported 3522a03fee34SRaja Mani * station. so we calculate this on our own 3523a03fee34SRaja Mani */ 35245e3dd157SKalle Valo arvif->u.ap.tim_len = 0; 3525a03fee34SRaja Mani for (i = 0; i < tim_len; i++) 35265e3dd157SKalle Valo if (arvif->u.ap.tim_bitmap[i]) 35275e3dd157SKalle Valo arvif->u.ap.tim_len = i; 35285e3dd157SKalle Valo 35295e3dd157SKalle Valo arvif->u.ap.tim_len++; 35305e3dd157SKalle Valo } 35315e3dd157SKalle Valo 35325e3dd157SKalle Valo ies = bcn->data; 35335e3dd157SKalle Valo ies += ieee80211_hdrlen(hdr->frame_control); 35345e3dd157SKalle Valo ies += 12; /* fixed parameters */ 35355e3dd157SKalle Valo 35365e3dd157SKalle Valo ie = (u8 *)cfg80211_find_ie(WLAN_EID_TIM, ies, 35375e3dd157SKalle Valo (u8 *)skb_tail_pointer(bcn) - ies); 35385e3dd157SKalle Valo if (!ie) { 353909af8f85SMichal Kazior if (arvif->vdev_type != WMI_VDEV_TYPE_IBSS) 35407aa7a72aSMichal Kazior ath10k_warn(ar, "no tim ie found;\n"); 35415e3dd157SKalle Valo return; 35425e3dd157SKalle Valo } 35435e3dd157SKalle Valo 35445e3dd157SKalle Valo tim = (void *)ie + 2; 35455e3dd157SKalle Valo ie_len = ie[1]; 35465e3dd157SKalle Valo pvm_len = ie_len - 3; /* exclude dtim count, dtim period, bmap ctl */ 35475e3dd157SKalle Valo 35485e3dd157SKalle Valo if (pvm_len < arvif->u.ap.tim_len) { 3549a03fee34SRaja Mani int expand_size = tim_len - pvm_len; 35505e3dd157SKalle Valo int move_size = skb_tail_pointer(bcn) - (ie + 2 + ie_len); 35515e3dd157SKalle Valo void *next_ie = ie + 2 + ie_len; 35525e3dd157SKalle Valo 35535e3dd157SKalle Valo if (skb_put(bcn, expand_size)) { 35545e3dd157SKalle Valo memmove(next_ie + expand_size, next_ie, move_size); 35555e3dd157SKalle Valo 35565e3dd157SKalle Valo ie[1] += expand_size; 35575e3dd157SKalle Valo ie_len += expand_size; 35585e3dd157SKalle Valo pvm_len += expand_size; 35595e3dd157SKalle Valo } else { 35607aa7a72aSMichal Kazior ath10k_warn(ar, "tim expansion failed\n"); 35615e3dd157SKalle Valo } 35625e3dd157SKalle Valo } 35635e3dd157SKalle Valo 3564a03fee34SRaja Mani if (pvm_len > tim_len) { 35657aa7a72aSMichal Kazior ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len); 35665e3dd157SKalle Valo return; 35675e3dd157SKalle Valo } 35685e3dd157SKalle Valo 356932653cf1SMichal Kazior tim->bitmap_ctrl = !!__le32_to_cpu(tim_info->tim_mcast); 35705e3dd157SKalle Valo memcpy(tim->virtual_map, arvif->u.ap.tim_bitmap, pvm_len); 35715e3dd157SKalle Valo 3572748afc47SMichal Kazior if (tim->dtim_count == 0) { 357366b8a010SMichal Kazior ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DTIM_ZERO; 3574748afc47SMichal Kazior 357532653cf1SMichal Kazior if (__le32_to_cpu(tim_info->tim_mcast) == 1) 357666b8a010SMichal Kazior ATH10K_SKB_CB(bcn)->flags |= ATH10K_SKB_F_DELIVER_CAB; 3577748afc47SMichal Kazior } 3578748afc47SMichal Kazior 35797aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n", 35805e3dd157SKalle Valo tim->dtim_count, tim->dtim_period, 35815e3dd157SKalle Valo tim->bitmap_ctrl, pvm_len); 35825e3dd157SKalle Valo } 35835e3dd157SKalle Valo 35845e3dd157SKalle Valo static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif, 35855e3dd157SKalle Valo struct sk_buff *bcn, 358632653cf1SMichal Kazior const struct wmi_p2p_noa_info *noa) 35875e3dd157SKalle Valo { 358808c27be1SPeter Oh if (!arvif->vif->p2p) 35895e3dd157SKalle Valo return; 35905e3dd157SKalle Valo 35917aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed); 35925e3dd157SKalle Valo 35936a94888fSMichal Kazior if (noa->changed & WMI_P2P_NOA_CHANGED_BIT) 35946a94888fSMichal Kazior ath10k_p2p_noa_update(arvif, noa); 35955e3dd157SKalle Valo 35965e3dd157SKalle Valo if (arvif->u.ap.noa_data) 35975e3dd157SKalle Valo if (!pskb_expand_head(bcn, 0, arvif->u.ap.noa_len, GFP_ATOMIC)) 359859ae1d12SJohannes Berg skb_put_data(bcn, arvif->u.ap.noa_data, 35995e3dd157SKalle Valo arvif->u.ap.noa_len); 36005e3dd157SKalle Valo } 36015e3dd157SKalle Valo 3602d7579d12SMichal Kazior static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb, 360332653cf1SMichal Kazior struct wmi_swba_ev_arg *arg) 360432653cf1SMichal Kazior { 360532653cf1SMichal Kazior struct wmi_host_swba_event *ev = (void *)skb->data; 360632653cf1SMichal Kazior u32 map; 360732653cf1SMichal Kazior size_t i; 360832653cf1SMichal Kazior 360932653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 361032653cf1SMichal Kazior return -EPROTO; 361132653cf1SMichal Kazior 361232653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 361332653cf1SMichal Kazior arg->vdev_map = ev->vdev_map; 361432653cf1SMichal Kazior 361532653cf1SMichal Kazior for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) { 361632653cf1SMichal Kazior if (!(map & BIT(0))) 361732653cf1SMichal Kazior continue; 361832653cf1SMichal Kazior 361932653cf1SMichal Kazior /* If this happens there were some changes in firmware and 362032653cf1SMichal Kazior * ath10k should update the max size of tim_info array. 362132653cf1SMichal Kazior */ 362232653cf1SMichal Kazior if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info))) 362332653cf1SMichal Kazior break; 362432653cf1SMichal Kazior 3625a03fee34SRaja Mani if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) > 3626a03fee34SRaja Mani sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) { 3627a03fee34SRaja Mani ath10k_warn(ar, "refusing to parse invalid swba structure\n"); 3628a03fee34SRaja Mani return -EPROTO; 3629a03fee34SRaja Mani } 3630a03fee34SRaja Mani 3631a03fee34SRaja Mani arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len; 3632a03fee34SRaja Mani arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast; 3633a03fee34SRaja Mani arg->tim_info[i].tim_bitmap = 3634a03fee34SRaja Mani ev->bcn_info[i].tim_info.tim_bitmap; 3635a03fee34SRaja Mani arg->tim_info[i].tim_changed = 3636a03fee34SRaja Mani ev->bcn_info[i].tim_info.tim_changed; 3637a03fee34SRaja Mani arg->tim_info[i].tim_num_ps_pending = 3638a03fee34SRaja Mani ev->bcn_info[i].tim_info.tim_num_ps_pending; 3639a03fee34SRaja Mani 364032653cf1SMichal Kazior arg->noa_info[i] = &ev->bcn_info[i].p2p_noa_info; 364132653cf1SMichal Kazior i++; 364232653cf1SMichal Kazior } 364332653cf1SMichal Kazior 364432653cf1SMichal Kazior return 0; 364532653cf1SMichal Kazior } 364632653cf1SMichal Kazior 36478b019fb0SYanbo Li static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar, 36488b019fb0SYanbo Li struct sk_buff *skb, 36498b019fb0SYanbo Li struct wmi_swba_ev_arg *arg) 36508b019fb0SYanbo Li { 36518b019fb0SYanbo Li struct wmi_10_2_4_host_swba_event *ev = (void *)skb->data; 36528b019fb0SYanbo Li u32 map; 36538b019fb0SYanbo Li size_t i; 36548b019fb0SYanbo Li 36558b019fb0SYanbo Li if (skb->len < sizeof(*ev)) 36568b019fb0SYanbo Li return -EPROTO; 36578b019fb0SYanbo Li 36588b019fb0SYanbo Li skb_pull(skb, sizeof(*ev)); 36598b019fb0SYanbo Li arg->vdev_map = ev->vdev_map; 36608b019fb0SYanbo Li 36618b019fb0SYanbo Li for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) { 36628b019fb0SYanbo Li if (!(map & BIT(0))) 36638b019fb0SYanbo Li continue; 36648b019fb0SYanbo Li 36658b019fb0SYanbo Li /* If this happens there were some changes in firmware and 36668b019fb0SYanbo Li * ath10k should update the max size of tim_info array. 36678b019fb0SYanbo Li */ 36688b019fb0SYanbo Li if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info))) 36698b019fb0SYanbo Li break; 36708b019fb0SYanbo Li 36718b019fb0SYanbo Li if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) > 36728b019fb0SYanbo Li sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) { 36738b019fb0SYanbo Li ath10k_warn(ar, "refusing to parse invalid swba structure\n"); 36748b019fb0SYanbo Li return -EPROTO; 36758b019fb0SYanbo Li } 36768b019fb0SYanbo Li 36778b019fb0SYanbo Li arg->tim_info[i].tim_len = ev->bcn_info[i].tim_info.tim_len; 36788b019fb0SYanbo Li arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast; 36798b019fb0SYanbo Li arg->tim_info[i].tim_bitmap = 36808b019fb0SYanbo Li ev->bcn_info[i].tim_info.tim_bitmap; 36818b019fb0SYanbo Li arg->tim_info[i].tim_changed = 36828b019fb0SYanbo Li ev->bcn_info[i].tim_info.tim_changed; 36838b019fb0SYanbo Li arg->tim_info[i].tim_num_ps_pending = 36848b019fb0SYanbo Li ev->bcn_info[i].tim_info.tim_num_ps_pending; 36858b019fb0SYanbo Li i++; 36868b019fb0SYanbo Li } 36878b019fb0SYanbo Li 36888b019fb0SYanbo Li return 0; 36898b019fb0SYanbo Li } 36908b019fb0SYanbo Li 36913cec3be3SRaja Mani static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar, 36923cec3be3SRaja Mani struct sk_buff *skb, 36933cec3be3SRaja Mani struct wmi_swba_ev_arg *arg) 36943cec3be3SRaja Mani { 36953cec3be3SRaja Mani struct wmi_10_4_host_swba_event *ev = (void *)skb->data; 36963cec3be3SRaja Mani u32 map, tim_len; 36973cec3be3SRaja Mani size_t i; 36983cec3be3SRaja Mani 36993cec3be3SRaja Mani if (skb->len < sizeof(*ev)) 37003cec3be3SRaja Mani return -EPROTO; 37013cec3be3SRaja Mani 37023cec3be3SRaja Mani skb_pull(skb, sizeof(*ev)); 37033cec3be3SRaja Mani arg->vdev_map = ev->vdev_map; 37043cec3be3SRaja Mani 37053cec3be3SRaja Mani for (i = 0, map = __le32_to_cpu(ev->vdev_map); map; map >>= 1) { 37063cec3be3SRaja Mani if (!(map & BIT(0))) 37073cec3be3SRaja Mani continue; 37083cec3be3SRaja Mani 37093cec3be3SRaja Mani /* If this happens there were some changes in firmware and 37103cec3be3SRaja Mani * ath10k should update the max size of tim_info array. 37113cec3be3SRaja Mani */ 37123cec3be3SRaja Mani if (WARN_ON_ONCE(i == ARRAY_SIZE(arg->tim_info))) 37133cec3be3SRaja Mani break; 37143cec3be3SRaja Mani 37153cec3be3SRaja Mani if (__le32_to_cpu(ev->bcn_info[i].tim_info.tim_len) > 37163cec3be3SRaja Mani sizeof(ev->bcn_info[i].tim_info.tim_bitmap)) { 37173cec3be3SRaja Mani ath10k_warn(ar, "refusing to parse invalid swba structure\n"); 37183cec3be3SRaja Mani return -EPROTO; 37193cec3be3SRaja Mani } 37203cec3be3SRaja Mani 37213cec3be3SRaja Mani tim_len = __le32_to_cpu(ev->bcn_info[i].tim_info.tim_len); 37223cec3be3SRaja Mani if (tim_len) { 37233cec3be3SRaja Mani /* Exclude 4 byte guard length */ 37243cec3be3SRaja Mani tim_len -= 4; 37253cec3be3SRaja Mani arg->tim_info[i].tim_len = __cpu_to_le32(tim_len); 37263cec3be3SRaja Mani } else { 37273cec3be3SRaja Mani arg->tim_info[i].tim_len = 0; 37283cec3be3SRaja Mani } 37293cec3be3SRaja Mani 37303cec3be3SRaja Mani arg->tim_info[i].tim_mcast = ev->bcn_info[i].tim_info.tim_mcast; 37313cec3be3SRaja Mani arg->tim_info[i].tim_bitmap = 37323cec3be3SRaja Mani ev->bcn_info[i].tim_info.tim_bitmap; 37333cec3be3SRaja Mani arg->tim_info[i].tim_changed = 37343cec3be3SRaja Mani ev->bcn_info[i].tim_info.tim_changed; 37353cec3be3SRaja Mani arg->tim_info[i].tim_num_ps_pending = 37363cec3be3SRaja Mani ev->bcn_info[i].tim_info.tim_num_ps_pending; 37373cec3be3SRaja Mani 37383cec3be3SRaja Mani /* 10.4 firmware doesn't have p2p support. notice of absence 37393cec3be3SRaja Mani * info can be ignored for now. 37403cec3be3SRaja Mani */ 37413cec3be3SRaja Mani 37423cec3be3SRaja Mani i++; 37433cec3be3SRaja Mani } 37443cec3be3SRaja Mani 37453cec3be3SRaja Mani return 0; 37463cec3be3SRaja Mani } 37473cec3be3SRaja Mani 374808e75ea8SVivek Natarajan static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar) 374908e75ea8SVivek Natarajan { 375008e75ea8SVivek Natarajan return WMI_TXBF_CONF_BEFORE_ASSOC; 375108e75ea8SVivek Natarajan } 375208e75ea8SVivek Natarajan 37530226d602SMichal Kazior void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb) 37545e3dd157SKalle Valo { 375532653cf1SMichal Kazior struct wmi_swba_ev_arg arg = {}; 37565e3dd157SKalle Valo u32 map; 37575e3dd157SKalle Valo int i = -1; 3758a03fee34SRaja Mani const struct wmi_tim_info_arg *tim_info; 375932653cf1SMichal Kazior const struct wmi_p2p_noa_info *noa_info; 37605e3dd157SKalle Valo struct ath10k_vif *arvif; 37615e3dd157SKalle Valo struct sk_buff *bcn; 376264badcb6SMichal Kazior dma_addr_t paddr; 3763767d34fcSMichal Kazior int ret, vdev_id = 0; 37645e3dd157SKalle Valo 3765d7579d12SMichal Kazior ret = ath10k_wmi_pull_swba(ar, skb, &arg); 376632653cf1SMichal Kazior if (ret) { 376732653cf1SMichal Kazior ath10k_warn(ar, "failed to parse swba event: %d\n", ret); 376832653cf1SMichal Kazior return; 376932653cf1SMichal Kazior } 377032653cf1SMichal Kazior 377132653cf1SMichal Kazior map = __le32_to_cpu(arg.vdev_map); 37725e3dd157SKalle Valo 37737aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n", 377432653cf1SMichal Kazior map); 37755e3dd157SKalle Valo 37765e3dd157SKalle Valo for (; map; map >>= 1, vdev_id++) { 37775e3dd157SKalle Valo if (!(map & 0x1)) 37785e3dd157SKalle Valo continue; 37795e3dd157SKalle Valo 37805e3dd157SKalle Valo i++; 37815e3dd157SKalle Valo 37825e3dd157SKalle Valo if (i >= WMI_MAX_AP_VDEV) { 37837aa7a72aSMichal Kazior ath10k_warn(ar, "swba has corrupted vdev map\n"); 37845e3dd157SKalle Valo break; 37855e3dd157SKalle Valo } 37865e3dd157SKalle Valo 3787a03fee34SRaja Mani tim_info = &arg.tim_info[i]; 378832653cf1SMichal Kazior noa_info = arg.noa_info[i]; 37895e3dd157SKalle Valo 37907aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_MGMT, 37917a8a396bSKalle Valo "mgmt event bcn_info %d tim_len %d mcast %d changed %d num_ps_pending %d bitmap 0x%08x%08x%08x%08x\n", 37925e3dd157SKalle Valo i, 379332653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_len), 379432653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_mcast), 379532653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_changed), 379632653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_num_ps_pending), 379732653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[3]), 379832653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[2]), 379932653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[1]), 380032653cf1SMichal Kazior __le32_to_cpu(tim_info->tim_bitmap[0])); 38015e3dd157SKalle Valo 3802a03fee34SRaja Mani /* TODO: Only first 4 word from tim_bitmap is dumped. 3803a03fee34SRaja Mani * Extend debug code to dump full tim_bitmap. 3804a03fee34SRaja Mani */ 3805a03fee34SRaja Mani 38065e3dd157SKalle Valo arvif = ath10k_get_arvif(ar, vdev_id); 38075e3dd157SKalle Valo if (arvif == NULL) { 38087aa7a72aSMichal Kazior ath10k_warn(ar, "no vif for vdev_id %d found\n", 38097aa7a72aSMichal Kazior vdev_id); 38105e3dd157SKalle Valo continue; 38115e3dd157SKalle Valo } 38125e3dd157SKalle Valo 3813b63b33ecSMohammed Shafi Shajakhan /* mac80211 would have already asked us to stop beaconing and 3814b63b33ecSMohammed Shafi Shajakhan * bring the vdev down, so continue in that case 3815b63b33ecSMohammed Shafi Shajakhan */ 3816b63b33ecSMohammed Shafi Shajakhan if (!arvif->is_up) 3817b63b33ecSMohammed Shafi Shajakhan continue; 3818b63b33ecSMohammed Shafi Shajakhan 3819c2df44b3SMichal Kazior /* There are no completions for beacons so wait for next SWBA 3820c2df44b3SMichal Kazior * before telling mac80211 to decrement CSA counter 3821c2df44b3SMichal Kazior * 3822c2df44b3SMichal Kazior * Once CSA counter is completed stop sending beacons until 3823d6dfe25cSMarcin Rokicki * actual channel switch is done 3824d6dfe25cSMarcin Rokicki */ 3825c2df44b3SMichal Kazior if (arvif->vif->csa_active && 3826c2df44b3SMichal Kazior ieee80211_csa_is_complete(arvif->vif)) { 3827c2df44b3SMichal Kazior ieee80211_csa_finish(arvif->vif); 3828c2df44b3SMichal Kazior continue; 3829c2df44b3SMichal Kazior } 3830c2df44b3SMichal Kazior 38315e3dd157SKalle Valo bcn = ieee80211_beacon_get(ar->hw, arvif->vif); 38325e3dd157SKalle Valo if (!bcn) { 38337aa7a72aSMichal Kazior ath10k_warn(ar, "could not get mac80211 beacon\n"); 38345e3dd157SKalle Valo continue; 38355e3dd157SKalle Valo } 38365e3dd157SKalle Valo 38374b604558SMichal Kazior ath10k_tx_h_seq_no(arvif->vif, bcn); 383832653cf1SMichal Kazior ath10k_wmi_update_tim(ar, arvif, bcn, tim_info); 383932653cf1SMichal Kazior ath10k_wmi_update_noa(ar, arvif, bcn, noa_info); 38405e3dd157SKalle Valo 3841ed54388aSMichal Kazior spin_lock_bh(&ar->data_lock); 3842748afc47SMichal Kazior 3843ed54388aSMichal Kazior if (arvif->beacon) { 3844af21319fSMichal Kazior switch (arvif->beacon_state) { 3845af21319fSMichal Kazior case ATH10K_BEACON_SENT: 3846af21319fSMichal Kazior break; 3847af21319fSMichal Kazior case ATH10K_BEACON_SCHEDULED: 3848af21319fSMichal Kazior ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n", 3849ed54388aSMichal Kazior arvif->vdev_id); 3850af21319fSMichal Kazior break; 3851af21319fSMichal Kazior case ATH10K_BEACON_SENDING: 3852af21319fSMichal Kazior ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n", 3853af21319fSMichal Kazior arvif->vdev_id); 3854af21319fSMichal Kazior dev_kfree_skb(bcn); 3855af21319fSMichal Kazior goto skip; 3856af21319fSMichal Kazior } 3857748afc47SMichal Kazior 385864badcb6SMichal Kazior ath10k_mac_vif_beacon_free(arvif); 3859ed54388aSMichal Kazior } 38605e3dd157SKalle Valo 386164badcb6SMichal Kazior if (!arvif->beacon_buf) { 386264badcb6SMichal Kazior paddr = dma_map_single(arvif->ar->dev, bcn->data, 386364badcb6SMichal Kazior bcn->len, DMA_TO_DEVICE); 386464badcb6SMichal Kazior ret = dma_mapping_error(arvif->ar->dev, paddr); 3865767d34fcSMichal Kazior if (ret) { 386664badcb6SMichal Kazior ath10k_warn(ar, "failed to map beacon: %d\n", 386764badcb6SMichal Kazior ret); 3868ad3d2153SMichal Kazior dev_kfree_skb_any(bcn); 3869767d34fcSMichal Kazior goto skip; 3870767d34fcSMichal Kazior } 3871748afc47SMichal Kazior 387264badcb6SMichal Kazior ATH10K_SKB_CB(bcn)->paddr = paddr; 387364badcb6SMichal Kazior } else { 387464badcb6SMichal Kazior if (bcn->len > IEEE80211_MAX_FRAME_LEN) { 387564badcb6SMichal Kazior ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n", 387664badcb6SMichal Kazior bcn->len, IEEE80211_MAX_FRAME_LEN); 387764badcb6SMichal Kazior skb_trim(bcn, IEEE80211_MAX_FRAME_LEN); 387864badcb6SMichal Kazior } 387964badcb6SMichal Kazior memcpy(arvif->beacon_buf, bcn->data, bcn->len); 388064badcb6SMichal Kazior ATH10K_SKB_CB(bcn)->paddr = arvif->beacon_paddr; 388164badcb6SMichal Kazior } 388264badcb6SMichal Kazior 3883ed54388aSMichal Kazior arvif->beacon = bcn; 3884af21319fSMichal Kazior arvif->beacon_state = ATH10K_BEACON_SCHEDULED; 38855e3dd157SKalle Valo 38865ce8e7fdSRajkumar Manoharan trace_ath10k_tx_hdr(ar, bcn->data, bcn->len); 38875ce8e7fdSRajkumar Manoharan trace_ath10k_tx_payload(ar, bcn->data, bcn->len); 38885ce8e7fdSRajkumar Manoharan 3889767d34fcSMichal Kazior skip: 3890ed54388aSMichal Kazior spin_unlock_bh(&ar->data_lock); 38915e3dd157SKalle Valo } 3892af21319fSMichal Kazior 3893af21319fSMichal Kazior ath10k_wmi_tx_beacons_nowait(ar); 38945e3dd157SKalle Valo } 38955e3dd157SKalle Valo 38960226d602SMichal Kazior void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb) 38975e3dd157SKalle Valo { 38987aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n"); 38995e3dd157SKalle Valo } 39005e3dd157SKalle Valo 39016f6eb1bcSSriram R static void ath10k_radar_detected(struct ath10k *ar) 39026f6eb1bcSSriram R { 39036f6eb1bcSSriram R ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n"); 39046f6eb1bcSSriram R ATH10K_DFS_STAT_INC(ar, radar_detected); 39056f6eb1bcSSriram R 39066f6eb1bcSSriram R /* Control radar events reporting in debugfs file 39076f6eb1bcSSriram R * dfs_block_radar_events 39086f6eb1bcSSriram R */ 39096f6eb1bcSSriram R if (ar->dfs_block_radar_events) 39106f6eb1bcSSriram R ath10k_info(ar, "DFS Radar detected, but ignored as requested\n"); 39116f6eb1bcSSriram R else 39126f6eb1bcSSriram R ieee80211_radar_detected(ar->hw); 39136f6eb1bcSSriram R } 39146f6eb1bcSSriram R 39156f6eb1bcSSriram R static void ath10k_radar_confirmation_work(struct work_struct *work) 39166f6eb1bcSSriram R { 39176f6eb1bcSSriram R struct ath10k *ar = container_of(work, struct ath10k, 39186f6eb1bcSSriram R radar_confirmation_work); 39196f6eb1bcSSriram R struct ath10k_radar_found_info radar_info; 39206f6eb1bcSSriram R int ret, time_left; 39216f6eb1bcSSriram R 39226f6eb1bcSSriram R reinit_completion(&ar->wmi.radar_confirm); 39236f6eb1bcSSriram R 39246f6eb1bcSSriram R spin_lock_bh(&ar->data_lock); 39256f6eb1bcSSriram R memcpy(&radar_info, &ar->last_radar_info, sizeof(radar_info)); 39266f6eb1bcSSriram R spin_unlock_bh(&ar->data_lock); 39276f6eb1bcSSriram R 39286f6eb1bcSSriram R ret = ath10k_wmi_report_radar_found(ar, &radar_info); 39296f6eb1bcSSriram R if (ret) { 39306f6eb1bcSSriram R ath10k_warn(ar, "failed to send radar found %d\n", ret); 39316f6eb1bcSSriram R goto wait_complete; 39326f6eb1bcSSriram R } 39336f6eb1bcSSriram R 39346f6eb1bcSSriram R time_left = wait_for_completion_timeout(&ar->wmi.radar_confirm, 39356f6eb1bcSSriram R ATH10K_WMI_DFS_CONF_TIMEOUT_HZ); 39366f6eb1bcSSriram R if (time_left) { 39376f6eb1bcSSriram R /* DFS Confirmation status event received and 39386f6eb1bcSSriram R * necessary action completed. 39396f6eb1bcSSriram R */ 39406f6eb1bcSSriram R goto wait_complete; 39416f6eb1bcSSriram R } else { 39426f6eb1bcSSriram R /* DFS Confirmation event not received from FW.Considering this 39436f6eb1bcSSriram R * as real radar. 39446f6eb1bcSSriram R */ 39456f6eb1bcSSriram R ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 39466f6eb1bcSSriram R "dfs confirmation not received from fw, considering as radar\n"); 39476f6eb1bcSSriram R goto radar_detected; 39486f6eb1bcSSriram R } 39496f6eb1bcSSriram R 39506f6eb1bcSSriram R radar_detected: 39516f6eb1bcSSriram R ath10k_radar_detected(ar); 39526f6eb1bcSSriram R 39536f6eb1bcSSriram R /* Reset state to allow sending confirmation on consecutive radar 39546f6eb1bcSSriram R * detections, unless radar confirmation is disabled/stopped. 39556f6eb1bcSSriram R */ 39566f6eb1bcSSriram R wait_complete: 39576f6eb1bcSSriram R spin_lock_bh(&ar->data_lock); 39586f6eb1bcSSriram R if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_STOPPED) 39596f6eb1bcSSriram R ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE; 39606f6eb1bcSSriram R spin_unlock_bh(&ar->data_lock); 39616f6eb1bcSSriram R } 39626f6eb1bcSSriram R 39639702c686SJanusz Dziedzic static void ath10k_dfs_radar_report(struct ath10k *ar, 3964991adf71SRaja Mani struct wmi_phyerr_ev_arg *phyerr, 39652332d0aeSMichal Kazior const struct phyerr_radar_report *rr, 39669702c686SJanusz Dziedzic u64 tsf) 39679702c686SJanusz Dziedzic { 39689702c686SJanusz Dziedzic u32 reg0, reg1, tsf32l; 3969500ff9f9SMichal Kazior struct ieee80211_channel *ch; 39709702c686SJanusz Dziedzic struct pulse_event pe; 39716f6eb1bcSSriram R struct radar_detector_specs rs; 39729702c686SJanusz Dziedzic u64 tsf64; 39739702c686SJanusz Dziedzic u8 rssi, width; 39746f6eb1bcSSriram R struct ath10k_radar_found_info *radar_info; 39759702c686SJanusz Dziedzic 39769702c686SJanusz Dziedzic reg0 = __le32_to_cpu(rr->reg0); 39779702c686SJanusz Dziedzic reg1 = __le32_to_cpu(rr->reg1); 39789702c686SJanusz Dziedzic 39797aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 39809702c686SJanusz Dziedzic "wmi phyerr radar report chirp %d max_width %d agc_total_gain %d pulse_delta_diff %d\n", 39819702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP), 39829702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_IS_MAX_WIDTH), 39839702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_AGC_TOTAL_GAIN), 39849702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_DIFF)); 39857aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 39869702c686SJanusz Dziedzic "wmi phyerr radar report pulse_delta_pean %d pulse_sidx %d fft_valid %d agc_mb_gain %d subchan_mask %d\n", 39879702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_DELTA_PEAK), 39889702c686SJanusz Dziedzic MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX), 39899702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_SRCH_FFT_VALID), 39909702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_AGC_MB_GAIN), 39919702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_SUBCHAN_MASK)); 39927aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 39939702c686SJanusz Dziedzic "wmi phyerr radar report pulse_tsf_offset 0x%X pulse_dur: %d\n", 39949702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_TSF_OFFSET), 39959702c686SJanusz Dziedzic MS(reg1, RADAR_REPORT_REG1_PULSE_DUR)); 39969702c686SJanusz Dziedzic 39979702c686SJanusz Dziedzic if (!ar->dfs_detector) 39989702c686SJanusz Dziedzic return; 39999702c686SJanusz Dziedzic 4000500ff9f9SMichal Kazior spin_lock_bh(&ar->data_lock); 4001500ff9f9SMichal Kazior ch = ar->rx_channel; 4002a28f6f27SMohammed Shafi Shajakhan 4003a28f6f27SMohammed Shafi Shajakhan /* fetch target operating channel during channel change */ 4004a28f6f27SMohammed Shafi Shajakhan if (!ch) 4005a28f6f27SMohammed Shafi Shajakhan ch = ar->tgt_oper_chan; 4006a28f6f27SMohammed Shafi Shajakhan 4007500ff9f9SMichal Kazior spin_unlock_bh(&ar->data_lock); 4008500ff9f9SMichal Kazior 4009500ff9f9SMichal Kazior if (!ch) { 4010500ff9f9SMichal Kazior ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n"); 4011500ff9f9SMichal Kazior goto radar_detected; 4012500ff9f9SMichal Kazior } 4013500ff9f9SMichal Kazior 40149702c686SJanusz Dziedzic /* report event to DFS pattern detector */ 4015991adf71SRaja Mani tsf32l = phyerr->tsf_timestamp; 40169702c686SJanusz Dziedzic tsf64 = tsf & (~0xFFFFFFFFULL); 40179702c686SJanusz Dziedzic tsf64 |= tsf32l; 40189702c686SJanusz Dziedzic 40199702c686SJanusz Dziedzic width = MS(reg1, RADAR_REPORT_REG1_PULSE_DUR); 40202332d0aeSMichal Kazior rssi = phyerr->rssi_combined; 40219702c686SJanusz Dziedzic 40229702c686SJanusz Dziedzic /* hardware store this as 8 bit signed value, 40239702c686SJanusz Dziedzic * set to zero if negative number 40249702c686SJanusz Dziedzic */ 40259702c686SJanusz Dziedzic if (rssi & 0x80) 40269702c686SJanusz Dziedzic rssi = 0; 40279702c686SJanusz Dziedzic 40289702c686SJanusz Dziedzic pe.ts = tsf64; 4029500ff9f9SMichal Kazior pe.freq = ch->center_freq; 40309702c686SJanusz Dziedzic pe.width = width; 40319702c686SJanusz Dziedzic pe.rssi = rssi; 40322c3f26a0SPeter Oh pe.chirp = (MS(reg0, RADAR_REPORT_REG0_PULSE_IS_CHIRP) != 0); 40337aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 40349702c686SJanusz Dziedzic "dfs add pulse freq: %d, width: %d, rssi %d, tsf: %llX\n", 40359702c686SJanusz Dziedzic pe.freq, pe.width, pe.rssi, pe.ts); 40369702c686SJanusz Dziedzic 40379702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, pulses_detected); 40389702c686SJanusz Dziedzic 40396f6eb1bcSSriram R if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe, &rs)) { 40407aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 40419702c686SJanusz Dziedzic "dfs no pulse pattern detected, yet\n"); 40429702c686SJanusz Dziedzic return; 40439702c686SJanusz Dziedzic } 40449702c686SJanusz Dziedzic 40456f6eb1bcSSriram R if ((test_bit(WMI_SERVICE_HOST_DFS_CHECK_SUPPORT, ar->wmi.svc_map)) && 40466f6eb1bcSSriram R ar->dfs_detector->region == NL80211_DFS_FCC) { 40476f6eb1bcSSriram R /* Consecutive radar indications need not be 40486f6eb1bcSSriram R * sent to the firmware until we get confirmation 40496f6eb1bcSSriram R * for the previous detected radar. 4050d6dfe25cSMarcin Rokicki */ 40516f6eb1bcSSriram R spin_lock_bh(&ar->data_lock); 40526f6eb1bcSSriram R if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_IDLE) { 40536f6eb1bcSSriram R spin_unlock_bh(&ar->data_lock); 40546f6eb1bcSSriram R return; 40556f6eb1bcSSriram R } 40566f6eb1bcSSriram R ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_INPROGRESS; 40576f6eb1bcSSriram R radar_info = &ar->last_radar_info; 40586f6eb1bcSSriram R 40596f6eb1bcSSriram R radar_info->pri_min = rs.pri_min; 40606f6eb1bcSSriram R radar_info->pri_max = rs.pri_max; 40616f6eb1bcSSriram R radar_info->width_min = rs.width_min; 40626f6eb1bcSSriram R radar_info->width_max = rs.width_max; 40636f6eb1bcSSriram R /*TODO Find sidx_min and sidx_max */ 40646f6eb1bcSSriram R radar_info->sidx_min = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX); 40656f6eb1bcSSriram R radar_info->sidx_max = MS(reg0, RADAR_REPORT_REG0_PULSE_SIDX); 40666f6eb1bcSSriram R 40676f6eb1bcSSriram R ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 40686f6eb1bcSSriram R "sending wmi radar found cmd pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n", 40696f6eb1bcSSriram R radar_info->pri_min, radar_info->pri_max, 40706f6eb1bcSSriram R radar_info->width_min, radar_info->width_max, 40716f6eb1bcSSriram R radar_info->sidx_min, radar_info->sidx_max); 40726f6eb1bcSSriram R ieee80211_queue_work(ar->hw, &ar->radar_confirmation_work); 40736f6eb1bcSSriram R spin_unlock_bh(&ar->data_lock); 40747d9b40b4SMarek Puzyniak return; 40757d9b40b4SMarek Puzyniak } 40767d9b40b4SMarek Puzyniak 40776f6eb1bcSSriram R radar_detected: 40786f6eb1bcSSriram R ath10k_radar_detected(ar); 40799702c686SJanusz Dziedzic } 40809702c686SJanusz Dziedzic 40819702c686SJanusz Dziedzic static int ath10k_dfs_fft_report(struct ath10k *ar, 4082991adf71SRaja Mani struct wmi_phyerr_ev_arg *phyerr, 40832332d0aeSMichal Kazior const struct phyerr_fft_report *fftr, 40849702c686SJanusz Dziedzic u64 tsf) 40859702c686SJanusz Dziedzic { 40869702c686SJanusz Dziedzic u32 reg0, reg1; 40879702c686SJanusz Dziedzic u8 rssi, peak_mag; 40889702c686SJanusz Dziedzic 40899702c686SJanusz Dziedzic reg0 = __le32_to_cpu(fftr->reg0); 40909702c686SJanusz Dziedzic reg1 = __le32_to_cpu(fftr->reg1); 40912332d0aeSMichal Kazior rssi = phyerr->rssi_combined; 40929702c686SJanusz Dziedzic 40937aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 40949702c686SJanusz Dziedzic "wmi phyerr fft report total_gain_db %d base_pwr_db %d fft_chn_idx %d peak_sidx %d\n", 40959702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_TOTAL_GAIN_DB), 40969702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_BASE_PWR_DB), 40979702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_FFT_CHN_IDX), 40989702c686SJanusz Dziedzic MS(reg0, SEARCH_FFT_REPORT_REG0_PEAK_SIDX)); 40997aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 41009702c686SJanusz Dziedzic "wmi phyerr fft report rel_pwr_db %d avgpwr_db %d peak_mag %d num_store_bin %d\n", 41019702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_RELPWR_DB), 41029702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_AVGPWR_DB), 41039702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG), 41049702c686SJanusz Dziedzic MS(reg1, SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB)); 41059702c686SJanusz Dziedzic 41069702c686SJanusz Dziedzic peak_mag = MS(reg1, SEARCH_FFT_REPORT_REG1_PEAK_MAG); 41079702c686SJanusz Dziedzic 41089702c686SJanusz Dziedzic /* false event detection */ 41099702c686SJanusz Dziedzic if (rssi == DFS_RSSI_POSSIBLY_FALSE && 41109702c686SJanusz Dziedzic peak_mag < 2 * DFS_PEAK_MAG_THOLD_POSSIBLY_FALSE) { 41117aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n"); 41129702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, pulses_discarded); 41139702c686SJanusz Dziedzic return -EINVAL; 41149702c686SJanusz Dziedzic } 41159702c686SJanusz Dziedzic 41169702c686SJanusz Dziedzic return 0; 41179702c686SJanusz Dziedzic } 41189702c686SJanusz Dziedzic 41190226d602SMichal Kazior void ath10k_wmi_event_dfs(struct ath10k *ar, 4120991adf71SRaja Mani struct wmi_phyerr_ev_arg *phyerr, 41219702c686SJanusz Dziedzic u64 tsf) 41229702c686SJanusz Dziedzic { 41239702c686SJanusz Dziedzic int buf_len, tlv_len, res, i = 0; 41242332d0aeSMichal Kazior const struct phyerr_tlv *tlv; 41252332d0aeSMichal Kazior const struct phyerr_radar_report *rr; 41262332d0aeSMichal Kazior const struct phyerr_fft_report *fftr; 41272332d0aeSMichal Kazior const u8 *tlv_buf; 41289702c686SJanusz Dziedzic 4129991adf71SRaja Mani buf_len = phyerr->buf_len; 41307aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 41319702c686SJanusz Dziedzic "wmi event dfs err_code %d rssi %d tsfl 0x%X tsf64 0x%llX len %d\n", 41322332d0aeSMichal Kazior phyerr->phy_err_code, phyerr->rssi_combined, 4133991adf71SRaja Mani phyerr->tsf_timestamp, tsf, buf_len); 41349702c686SJanusz Dziedzic 41359702c686SJanusz Dziedzic /* Skip event if DFS disabled */ 413697f2645fSMasahiro Yamada if (!IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) 41379702c686SJanusz Dziedzic return; 41389702c686SJanusz Dziedzic 41399702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, pulses_total); 41409702c686SJanusz Dziedzic 41419702c686SJanusz Dziedzic while (i < buf_len) { 41429702c686SJanusz Dziedzic if (i + sizeof(*tlv) > buf_len) { 41437aa7a72aSMichal Kazior ath10k_warn(ar, "too short buf for tlv header (%d)\n", 41447aa7a72aSMichal Kazior i); 41459702c686SJanusz Dziedzic return; 41469702c686SJanusz Dziedzic } 41479702c686SJanusz Dziedzic 41482332d0aeSMichal Kazior tlv = (struct phyerr_tlv *)&phyerr->buf[i]; 41499702c686SJanusz Dziedzic tlv_len = __le16_to_cpu(tlv->len); 41502332d0aeSMichal Kazior tlv_buf = &phyerr->buf[i + sizeof(*tlv)]; 41517aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 41529702c686SJanusz Dziedzic "wmi event dfs tlv_len %d tlv_tag 0x%02X tlv_sig 0x%02X\n", 41539702c686SJanusz Dziedzic tlv_len, tlv->tag, tlv->sig); 41549702c686SJanusz Dziedzic 41559702c686SJanusz Dziedzic switch (tlv->tag) { 41569702c686SJanusz Dziedzic case PHYERR_TLV_TAG_RADAR_PULSE_SUMMARY: 41579702c686SJanusz Dziedzic if (i + sizeof(*tlv) + sizeof(*rr) > buf_len) { 41587aa7a72aSMichal Kazior ath10k_warn(ar, "too short radar pulse summary (%d)\n", 41599702c686SJanusz Dziedzic i); 41609702c686SJanusz Dziedzic return; 41619702c686SJanusz Dziedzic } 41629702c686SJanusz Dziedzic 41639702c686SJanusz Dziedzic rr = (struct phyerr_radar_report *)tlv_buf; 41642332d0aeSMichal Kazior ath10k_dfs_radar_report(ar, phyerr, rr, tsf); 41659702c686SJanusz Dziedzic break; 41669702c686SJanusz Dziedzic case PHYERR_TLV_TAG_SEARCH_FFT_REPORT: 41679702c686SJanusz Dziedzic if (i + sizeof(*tlv) + sizeof(*fftr) > buf_len) { 41687aa7a72aSMichal Kazior ath10k_warn(ar, "too short fft report (%d)\n", 41697aa7a72aSMichal Kazior i); 41709702c686SJanusz Dziedzic return; 41719702c686SJanusz Dziedzic } 41729702c686SJanusz Dziedzic 41739702c686SJanusz Dziedzic fftr = (struct phyerr_fft_report *)tlv_buf; 41742332d0aeSMichal Kazior res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf); 41759702c686SJanusz Dziedzic if (res) 41769702c686SJanusz Dziedzic return; 41779702c686SJanusz Dziedzic break; 41789702c686SJanusz Dziedzic } 41799702c686SJanusz Dziedzic 41809702c686SJanusz Dziedzic i += sizeof(*tlv) + tlv_len; 41819702c686SJanusz Dziedzic } 41829702c686SJanusz Dziedzic } 41839702c686SJanusz Dziedzic 41840226d602SMichal Kazior void ath10k_wmi_event_spectral_scan(struct ath10k *ar, 4185991adf71SRaja Mani struct wmi_phyerr_ev_arg *phyerr, 41869702c686SJanusz Dziedzic u64 tsf) 41879702c686SJanusz Dziedzic { 4188855aed12SSimon Wunderlich int buf_len, tlv_len, res, i = 0; 4189855aed12SSimon Wunderlich struct phyerr_tlv *tlv; 41902332d0aeSMichal Kazior const void *tlv_buf; 41912332d0aeSMichal Kazior const struct phyerr_fft_report *fftr; 4192855aed12SSimon Wunderlich size_t fftr_len; 4193855aed12SSimon Wunderlich 4194991adf71SRaja Mani buf_len = phyerr->buf_len; 4195855aed12SSimon Wunderlich 4196855aed12SSimon Wunderlich while (i < buf_len) { 4197855aed12SSimon Wunderlich if (i + sizeof(*tlv) > buf_len) { 41987aa7a72aSMichal Kazior ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n", 4199855aed12SSimon Wunderlich i); 4200855aed12SSimon Wunderlich return; 4201855aed12SSimon Wunderlich } 4202855aed12SSimon Wunderlich 42032332d0aeSMichal Kazior tlv = (struct phyerr_tlv *)&phyerr->buf[i]; 4204855aed12SSimon Wunderlich tlv_len = __le16_to_cpu(tlv->len); 42052332d0aeSMichal Kazior tlv_buf = &phyerr->buf[i + sizeof(*tlv)]; 4206855aed12SSimon Wunderlich 4207855aed12SSimon Wunderlich if (i + sizeof(*tlv) + tlv_len > buf_len) { 42087aa7a72aSMichal Kazior ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n", 4209855aed12SSimon Wunderlich i); 4210855aed12SSimon Wunderlich return; 4211855aed12SSimon Wunderlich } 4212855aed12SSimon Wunderlich 4213855aed12SSimon Wunderlich switch (tlv->tag) { 4214855aed12SSimon Wunderlich case PHYERR_TLV_TAG_SEARCH_FFT_REPORT: 4215855aed12SSimon Wunderlich if (sizeof(*fftr) > tlv_len) { 42167aa7a72aSMichal Kazior ath10k_warn(ar, "failed to parse fft report at byte %d\n", 4217855aed12SSimon Wunderlich i); 4218855aed12SSimon Wunderlich return; 4219855aed12SSimon Wunderlich } 4220855aed12SSimon Wunderlich 4221855aed12SSimon Wunderlich fftr_len = tlv_len - sizeof(*fftr); 42222332d0aeSMichal Kazior fftr = tlv_buf; 42232332d0aeSMichal Kazior res = ath10k_spectral_process_fft(ar, phyerr, 4224855aed12SSimon Wunderlich fftr, fftr_len, 4225855aed12SSimon Wunderlich tsf); 4226855aed12SSimon Wunderlich if (res < 0) { 42273413e97dSKevin Darbyshire-Bryant ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n", 4228855aed12SSimon Wunderlich res); 4229855aed12SSimon Wunderlich return; 4230855aed12SSimon Wunderlich } 4231855aed12SSimon Wunderlich break; 4232855aed12SSimon Wunderlich } 4233855aed12SSimon Wunderlich 4234855aed12SSimon Wunderlich i += sizeof(*tlv) + tlv_len; 4235855aed12SSimon Wunderlich } 42369702c686SJanusz Dziedzic } 42379702c686SJanusz Dziedzic 4238991adf71SRaja Mani static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar, 4239991adf71SRaja Mani struct sk_buff *skb, 4240991adf71SRaja Mani struct wmi_phyerr_hdr_arg *arg) 424132653cf1SMichal Kazior { 424232653cf1SMichal Kazior struct wmi_phyerr_event *ev = (void *)skb->data; 424332653cf1SMichal Kazior 424432653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 424532653cf1SMichal Kazior return -EPROTO; 424632653cf1SMichal Kazior 4247991adf71SRaja Mani arg->num_phyerrs = __le32_to_cpu(ev->num_phyerrs); 4248991adf71SRaja Mani arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32); 4249991adf71SRaja Mani arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32); 4250991adf71SRaja Mani arg->buf_len = skb->len - sizeof(*ev); 425132653cf1SMichal Kazior arg->phyerrs = ev->phyerrs; 425232653cf1SMichal Kazior 425332653cf1SMichal Kazior return 0; 425432653cf1SMichal Kazior } 425532653cf1SMichal Kazior 42562b0a2e0dSRaja Mani static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar, 42572b0a2e0dSRaja Mani struct sk_buff *skb, 42582b0a2e0dSRaja Mani struct wmi_phyerr_hdr_arg *arg) 42592b0a2e0dSRaja Mani { 42602b0a2e0dSRaja Mani struct wmi_10_4_phyerr_event *ev = (void *)skb->data; 42612b0a2e0dSRaja Mani 42622b0a2e0dSRaja Mani if (skb->len < sizeof(*ev)) 42632b0a2e0dSRaja Mani return -EPROTO; 42642b0a2e0dSRaja Mani 42652b0a2e0dSRaja Mani /* 10.4 firmware always reports only one phyerr */ 42662b0a2e0dSRaja Mani arg->num_phyerrs = 1; 42672b0a2e0dSRaja Mani 42682b0a2e0dSRaja Mani arg->tsf_l32 = __le32_to_cpu(ev->tsf_l32); 42692b0a2e0dSRaja Mani arg->tsf_u32 = __le32_to_cpu(ev->tsf_u32); 42702b0a2e0dSRaja Mani arg->buf_len = skb->len; 42712b0a2e0dSRaja Mani arg->phyerrs = skb->data; 42722b0a2e0dSRaja Mani 42732b0a2e0dSRaja Mani return 0; 42742b0a2e0dSRaja Mani } 42752b0a2e0dSRaja Mani 4276991adf71SRaja Mani int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar, 4277991adf71SRaja Mani const void *phyerr_buf, 4278991adf71SRaja Mani int left_len, 4279991adf71SRaja Mani struct wmi_phyerr_ev_arg *arg) 4280991adf71SRaja Mani { 4281991adf71SRaja Mani const struct wmi_phyerr *phyerr = phyerr_buf; 4282991adf71SRaja Mani int i; 4283991adf71SRaja Mani 4284991adf71SRaja Mani if (left_len < sizeof(*phyerr)) { 4285ee92a209SRaja Mani ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n", 4286991adf71SRaja Mani left_len, sizeof(*phyerr)); 4287991adf71SRaja Mani return -EINVAL; 4288991adf71SRaja Mani } 4289991adf71SRaja Mani 4290991adf71SRaja Mani arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp); 4291991adf71SRaja Mani arg->freq1 = __le16_to_cpu(phyerr->freq1); 4292991adf71SRaja Mani arg->freq2 = __le16_to_cpu(phyerr->freq2); 4293991adf71SRaja Mani arg->rssi_combined = phyerr->rssi_combined; 4294991adf71SRaja Mani arg->chan_width_mhz = phyerr->chan_width_mhz; 4295991adf71SRaja Mani arg->buf_len = __le32_to_cpu(phyerr->buf_len); 4296991adf71SRaja Mani arg->buf = phyerr->buf; 4297991adf71SRaja Mani arg->hdr_len = sizeof(*phyerr); 4298991adf71SRaja Mani 4299991adf71SRaja Mani for (i = 0; i < 4; i++) 4300991adf71SRaja Mani arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]); 4301991adf71SRaja Mani 4302991adf71SRaja Mani switch (phyerr->phy_err_code) { 4303991adf71SRaja Mani case PHY_ERROR_GEN_SPECTRAL_SCAN: 4304991adf71SRaja Mani arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN; 4305991adf71SRaja Mani break; 4306991adf71SRaja Mani case PHY_ERROR_GEN_FALSE_RADAR_EXT: 4307991adf71SRaja Mani arg->phy_err_code = PHY_ERROR_FALSE_RADAR_EXT; 4308991adf71SRaja Mani break; 4309991adf71SRaja Mani case PHY_ERROR_GEN_RADAR: 4310991adf71SRaja Mani arg->phy_err_code = PHY_ERROR_RADAR; 4311991adf71SRaja Mani break; 4312991adf71SRaja Mani default: 4313991adf71SRaja Mani arg->phy_err_code = PHY_ERROR_UNKNOWN; 4314991adf71SRaja Mani break; 4315991adf71SRaja Mani } 4316991adf71SRaja Mani 4317991adf71SRaja Mani return 0; 4318991adf71SRaja Mani } 4319991adf71SRaja Mani 43202b0a2e0dSRaja Mani static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar, 43212b0a2e0dSRaja Mani const void *phyerr_buf, 43222b0a2e0dSRaja Mani int left_len, 43232b0a2e0dSRaja Mani struct wmi_phyerr_ev_arg *arg) 43242b0a2e0dSRaja Mani { 43252b0a2e0dSRaja Mani const struct wmi_10_4_phyerr_event *phyerr = phyerr_buf; 43262b0a2e0dSRaja Mani u32 phy_err_mask; 43272b0a2e0dSRaja Mani int i; 43282b0a2e0dSRaja Mani 43292b0a2e0dSRaja Mani if (left_len < sizeof(*phyerr)) { 4330ee92a209SRaja Mani ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n", 43312b0a2e0dSRaja Mani left_len, sizeof(*phyerr)); 43322b0a2e0dSRaja Mani return -EINVAL; 43332b0a2e0dSRaja Mani } 43342b0a2e0dSRaja Mani 43352b0a2e0dSRaja Mani arg->tsf_timestamp = __le32_to_cpu(phyerr->tsf_timestamp); 43362b0a2e0dSRaja Mani arg->freq1 = __le16_to_cpu(phyerr->freq1); 43372b0a2e0dSRaja Mani arg->freq2 = __le16_to_cpu(phyerr->freq2); 43382b0a2e0dSRaja Mani arg->rssi_combined = phyerr->rssi_combined; 43392b0a2e0dSRaja Mani arg->chan_width_mhz = phyerr->chan_width_mhz; 43402b0a2e0dSRaja Mani arg->buf_len = __le32_to_cpu(phyerr->buf_len); 43412b0a2e0dSRaja Mani arg->buf = phyerr->buf; 43422b0a2e0dSRaja Mani arg->hdr_len = sizeof(*phyerr); 43432b0a2e0dSRaja Mani 43442b0a2e0dSRaja Mani for (i = 0; i < 4; i++) 43452b0a2e0dSRaja Mani arg->nf_chains[i] = __le16_to_cpu(phyerr->nf_chains[i]); 43462b0a2e0dSRaja Mani 43472b0a2e0dSRaja Mani phy_err_mask = __le32_to_cpu(phyerr->phy_err_mask[0]); 43482b0a2e0dSRaja Mani 43492b0a2e0dSRaja Mani if (phy_err_mask & PHY_ERROR_10_4_SPECTRAL_SCAN_MASK) 43502b0a2e0dSRaja Mani arg->phy_err_code = PHY_ERROR_SPECTRAL_SCAN; 43512b0a2e0dSRaja Mani else if (phy_err_mask & PHY_ERROR_10_4_RADAR_MASK) 43522b0a2e0dSRaja Mani arg->phy_err_code = PHY_ERROR_RADAR; 43532b0a2e0dSRaja Mani else 43542b0a2e0dSRaja Mani arg->phy_err_code = PHY_ERROR_UNKNOWN; 43552b0a2e0dSRaja Mani 43562b0a2e0dSRaja Mani return 0; 43572b0a2e0dSRaja Mani } 43582b0a2e0dSRaja Mani 43590226d602SMichal Kazior void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb) 43605e3dd157SKalle Valo { 4361991adf71SRaja Mani struct wmi_phyerr_hdr_arg hdr_arg = {}; 4362991adf71SRaja Mani struct wmi_phyerr_ev_arg phyerr_arg = {}; 4363991adf71SRaja Mani const void *phyerr; 43649702c686SJanusz Dziedzic u32 count, i, buf_len, phy_err_code; 43659702c686SJanusz Dziedzic u64 tsf; 436632653cf1SMichal Kazior int left_len, ret; 43679702c686SJanusz Dziedzic 43689702c686SJanusz Dziedzic ATH10K_DFS_STAT_INC(ar, phy_errors); 43699702c686SJanusz Dziedzic 4370991adf71SRaja Mani ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg); 437132653cf1SMichal Kazior if (ret) { 4372991adf71SRaja Mani ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret); 43739702c686SJanusz Dziedzic return; 43749702c686SJanusz Dziedzic } 43759702c686SJanusz Dziedzic 43769702c686SJanusz Dziedzic /* Check number of included events */ 4377991adf71SRaja Mani count = hdr_arg.num_phyerrs; 43789702c686SJanusz Dziedzic 4379991adf71SRaja Mani left_len = hdr_arg.buf_len; 4380991adf71SRaja Mani 4381991adf71SRaja Mani tsf = hdr_arg.tsf_u32; 43829702c686SJanusz Dziedzic tsf <<= 32; 4383991adf71SRaja Mani tsf |= hdr_arg.tsf_l32; 43849702c686SJanusz Dziedzic 43857aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 43869702c686SJanusz Dziedzic "wmi event phyerr count %d tsf64 0x%llX\n", 43879702c686SJanusz Dziedzic count, tsf); 43889702c686SJanusz Dziedzic 4389991adf71SRaja Mani phyerr = hdr_arg.phyerrs; 43909702c686SJanusz Dziedzic for (i = 0; i < count; i++) { 4391991adf71SRaja Mani ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg); 4392991adf71SRaja Mani if (ret) { 4393991adf71SRaja Mani ath10k_warn(ar, "failed to parse phyerr event (%d)\n", 43947aa7a72aSMichal Kazior i); 43959702c686SJanusz Dziedzic return; 43969702c686SJanusz Dziedzic } 43979702c686SJanusz Dziedzic 4398991adf71SRaja Mani left_len -= phyerr_arg.hdr_len; 4399991adf71SRaja Mani buf_len = phyerr_arg.buf_len; 4400991adf71SRaja Mani phy_err_code = phyerr_arg.phy_err_code; 44019702c686SJanusz Dziedzic 44029702c686SJanusz Dziedzic if (left_len < buf_len) { 44037aa7a72aSMichal Kazior ath10k_warn(ar, "single event (%d) wrong buf len\n", i); 44049702c686SJanusz Dziedzic return; 44059702c686SJanusz Dziedzic } 44069702c686SJanusz Dziedzic 44079702c686SJanusz Dziedzic left_len -= buf_len; 44089702c686SJanusz Dziedzic 44099702c686SJanusz Dziedzic switch (phy_err_code) { 44109702c686SJanusz Dziedzic case PHY_ERROR_RADAR: 4411991adf71SRaja Mani ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf); 44129702c686SJanusz Dziedzic break; 44139702c686SJanusz Dziedzic case PHY_ERROR_SPECTRAL_SCAN: 4414991adf71SRaja Mani ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf); 44159702c686SJanusz Dziedzic break; 44169702c686SJanusz Dziedzic case PHY_ERROR_FALSE_RADAR_EXT: 4417991adf71SRaja Mani ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf); 4418991adf71SRaja Mani ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf); 44199702c686SJanusz Dziedzic break; 44209702c686SJanusz Dziedzic default: 44219702c686SJanusz Dziedzic break; 44229702c686SJanusz Dziedzic } 44239702c686SJanusz Dziedzic 4424991adf71SRaja Mani phyerr = phyerr + phyerr_arg.hdr_len + buf_len; 44259702c686SJanusz Dziedzic } 44265e3dd157SKalle Valo } 44275e3dd157SKalle Valo 44286f6eb1bcSSriram R static int 44296f6eb1bcSSriram R ath10k_wmi_10_4_op_pull_dfs_status_ev(struct ath10k *ar, struct sk_buff *skb, 44306f6eb1bcSSriram R struct wmi_dfs_status_ev_arg *arg) 44316f6eb1bcSSriram R { 44326f6eb1bcSSriram R struct wmi_dfs_status_ev_arg *ev = (void *)skb->data; 44336f6eb1bcSSriram R 44346f6eb1bcSSriram R if (skb->len < sizeof(*ev)) 44356f6eb1bcSSriram R return -EPROTO; 44366f6eb1bcSSriram R 44376f6eb1bcSSriram R arg->status = ev->status; 44386f6eb1bcSSriram R 44396f6eb1bcSSriram R return 0; 44406f6eb1bcSSriram R } 44416f6eb1bcSSriram R 44426f6eb1bcSSriram R static void 44436f6eb1bcSSriram R ath10k_wmi_event_dfs_status_check(struct ath10k *ar, struct sk_buff *skb) 44446f6eb1bcSSriram R { 44456f6eb1bcSSriram R struct wmi_dfs_status_ev_arg status_arg = {}; 44466f6eb1bcSSriram R int ret; 44476f6eb1bcSSriram R 44486f6eb1bcSSriram R ret = ath10k_wmi_pull_dfs_status(ar, skb, &status_arg); 44496f6eb1bcSSriram R 44506f6eb1bcSSriram R if (ret) { 44516f6eb1bcSSriram R ath10k_warn(ar, "failed to parse dfs status event: %d\n", ret); 44526f6eb1bcSSriram R return; 44536f6eb1bcSSriram R } 44546f6eb1bcSSriram R 44556f6eb1bcSSriram R ath10k_dbg(ar, ATH10K_DBG_REGULATORY, 44566f6eb1bcSSriram R "dfs status event received from fw: %d\n", 44576f6eb1bcSSriram R status_arg.status); 44586f6eb1bcSSriram R 44596f6eb1bcSSriram R /* Even in case of radar detection failure we follow the same 44606f6eb1bcSSriram R * behaviour as if radar is detected i.e to switch to a different 44616f6eb1bcSSriram R * channel. 44626f6eb1bcSSriram R */ 44636f6eb1bcSSriram R if (status_arg.status == WMI_HW_RADAR_DETECTED || 44646f6eb1bcSSriram R status_arg.status == WMI_RADAR_DETECTION_FAIL) 44656f6eb1bcSSriram R ath10k_radar_detected(ar); 44666f6eb1bcSSriram R complete(&ar->wmi.radar_confirm); 44676f6eb1bcSSriram R } 44686f6eb1bcSSriram R 44690226d602SMichal Kazior void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb) 44705e3dd157SKalle Valo { 4471c1a4654aSMichal Kazior struct wmi_roam_ev_arg arg = {}; 4472c1a4654aSMichal Kazior int ret; 4473c1a4654aSMichal Kazior u32 vdev_id; 4474c1a4654aSMichal Kazior u32 reason; 4475c1a4654aSMichal Kazior s32 rssi; 4476c1a4654aSMichal Kazior 4477c1a4654aSMichal Kazior ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg); 4478c1a4654aSMichal Kazior if (ret) { 4479c1a4654aSMichal Kazior ath10k_warn(ar, "failed to parse roam event: %d\n", ret); 4480c1a4654aSMichal Kazior return; 4481c1a4654aSMichal Kazior } 4482c1a4654aSMichal Kazior 4483c1a4654aSMichal Kazior vdev_id = __le32_to_cpu(arg.vdev_id); 4484c1a4654aSMichal Kazior reason = __le32_to_cpu(arg.reason); 4485c1a4654aSMichal Kazior rssi = __le32_to_cpu(arg.rssi); 4486c1a4654aSMichal Kazior rssi += WMI_SPECTRAL_NOISE_FLOOR_REF_DEFAULT; 4487c1a4654aSMichal Kazior 4488c1a4654aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 4489c1a4654aSMichal Kazior "wmi roam event vdev %u reason 0x%08x rssi %d\n", 4490c1a4654aSMichal Kazior vdev_id, reason, rssi); 4491c1a4654aSMichal Kazior 4492c1a4654aSMichal Kazior if (reason >= WMI_ROAM_REASON_MAX) 4493c1a4654aSMichal Kazior ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n", 4494c1a4654aSMichal Kazior reason, vdev_id); 4495c1a4654aSMichal Kazior 4496c1a4654aSMichal Kazior switch (reason) { 4497c1a4654aSMichal Kazior case WMI_ROAM_REASON_BEACON_MISS: 4498cc9904e6SMichal Kazior ath10k_mac_handle_beacon_miss(ar, vdev_id); 4499cc9904e6SMichal Kazior break; 4500cc9904e6SMichal Kazior case WMI_ROAM_REASON_BETTER_AP: 4501c1a4654aSMichal Kazior case WMI_ROAM_REASON_LOW_RSSI: 4502c1a4654aSMichal Kazior case WMI_ROAM_REASON_SUITABLE_AP_FOUND: 4503c1a4654aSMichal Kazior case WMI_ROAM_REASON_HO_FAILED: 4504c1a4654aSMichal Kazior ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n", 4505c1a4654aSMichal Kazior reason, vdev_id); 4506c1a4654aSMichal Kazior break; 4507c1a4654aSMichal Kazior } 45085e3dd157SKalle Valo } 45095e3dd157SKalle Valo 45100226d602SMichal Kazior void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb) 45115e3dd157SKalle Valo { 45127aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n"); 45135e3dd157SKalle Valo } 45145e3dd157SKalle Valo 45150226d602SMichal Kazior void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb) 45165e3dd157SKalle Valo { 45172fe5288cSKalle Valo char buf[101], c; 45182fe5288cSKalle Valo int i; 45192fe5288cSKalle Valo 45202fe5288cSKalle Valo for (i = 0; i < sizeof(buf) - 1; i++) { 45212fe5288cSKalle Valo if (i >= skb->len) 45222fe5288cSKalle Valo break; 45232fe5288cSKalle Valo 45242fe5288cSKalle Valo c = skb->data[i]; 45252fe5288cSKalle Valo 45262fe5288cSKalle Valo if (c == '\0') 45272fe5288cSKalle Valo break; 45282fe5288cSKalle Valo 45292fe5288cSKalle Valo if (isascii(c) && isprint(c)) 45302fe5288cSKalle Valo buf[i] = c; 45312fe5288cSKalle Valo else 45322fe5288cSKalle Valo buf[i] = '.'; 45332fe5288cSKalle Valo } 45342fe5288cSKalle Valo 45352fe5288cSKalle Valo if (i == sizeof(buf) - 1) 45367aa7a72aSMichal Kazior ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len); 45372fe5288cSKalle Valo 45382fe5288cSKalle Valo /* for some reason the debug prints end with \n, remove that */ 45392fe5288cSKalle Valo if (skb->data[i - 1] == '\n') 45402fe5288cSKalle Valo i--; 45412fe5288cSKalle Valo 45422fe5288cSKalle Valo /* the last byte is always reserved for the null character */ 45432fe5288cSKalle Valo buf[i] = '\0'; 45442fe5288cSKalle Valo 45453be004c3SBen Greear ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf); 45465e3dd157SKalle Valo } 45475e3dd157SKalle Valo 45480226d602SMichal Kazior void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb) 45495e3dd157SKalle Valo { 45507aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n"); 45515e3dd157SKalle Valo } 45525e3dd157SKalle Valo 45530226d602SMichal Kazior void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb) 45545e3dd157SKalle Valo { 45557aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n"); 45565e3dd157SKalle Valo } 45575e3dd157SKalle Valo 45580226d602SMichal Kazior void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar, 45595e3dd157SKalle Valo struct sk_buff *skb) 45605e3dd157SKalle Valo { 45617aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n"); 45625e3dd157SKalle Valo } 45635e3dd157SKalle Valo 45640226d602SMichal Kazior void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar, 45655e3dd157SKalle Valo struct sk_buff *skb) 45665e3dd157SKalle Valo { 45677aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n"); 45685e3dd157SKalle Valo } 45695e3dd157SKalle Valo 45700226d602SMichal Kazior void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb) 45715e3dd157SKalle Valo { 45727aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n"); 45735e3dd157SKalle Valo } 45745e3dd157SKalle Valo 45750226d602SMichal Kazior void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb) 45765e3dd157SKalle Valo { 45775fd3ac3cSJanusz Dziedzic struct wmi_wow_ev_arg ev = {}; 45785fd3ac3cSJanusz Dziedzic int ret; 45795fd3ac3cSJanusz Dziedzic 45805fd3ac3cSJanusz Dziedzic complete(&ar->wow.wakeup_completed); 45815fd3ac3cSJanusz Dziedzic 45825fd3ac3cSJanusz Dziedzic ret = ath10k_wmi_pull_wow_event(ar, skb, &ev); 45835fd3ac3cSJanusz Dziedzic if (ret) { 45845fd3ac3cSJanusz Dziedzic ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret); 45855fd3ac3cSJanusz Dziedzic return; 45865fd3ac3cSJanusz Dziedzic } 45875fd3ac3cSJanusz Dziedzic 45885fd3ac3cSJanusz Dziedzic ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n", 45895fd3ac3cSJanusz Dziedzic wow_reason(ev.wake_reason)); 45905e3dd157SKalle Valo } 45915e3dd157SKalle Valo 45920226d602SMichal Kazior void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb) 45935e3dd157SKalle Valo { 45947aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n"); 45955e3dd157SKalle Valo } 45965e3dd157SKalle Valo 459729542666SMaharaja Kennadyrajan static u8 ath10k_tpc_config_get_rate(struct ath10k *ar, 459829542666SMaharaja Kennadyrajan struct wmi_pdev_tpc_config_event *ev, 459929542666SMaharaja Kennadyrajan u32 rate_idx, u32 num_chains, 460029542666SMaharaja Kennadyrajan u32 rate_code, u8 type) 460129542666SMaharaja Kennadyrajan { 460229542666SMaharaja Kennadyrajan u8 tpc, num_streams, preamble, ch, stm_idx; 460329542666SMaharaja Kennadyrajan 460429542666SMaharaja Kennadyrajan num_streams = ATH10K_HW_NSS(rate_code); 460529542666SMaharaja Kennadyrajan preamble = ATH10K_HW_PREAMBLE(rate_code); 460629542666SMaharaja Kennadyrajan ch = num_chains - 1; 460729542666SMaharaja Kennadyrajan 460829542666SMaharaja Kennadyrajan tpc = min_t(u8, ev->rates_array[rate_idx], ev->max_reg_allow_pow[ch]); 460929542666SMaharaja Kennadyrajan 461029542666SMaharaja Kennadyrajan if (__le32_to_cpu(ev->num_tx_chain) <= 1) 461129542666SMaharaja Kennadyrajan goto out; 461229542666SMaharaja Kennadyrajan 461329542666SMaharaja Kennadyrajan if (preamble == WMI_RATE_PREAMBLE_CCK) 461429542666SMaharaja Kennadyrajan goto out; 461529542666SMaharaja Kennadyrajan 461629542666SMaharaja Kennadyrajan stm_idx = num_streams - 1; 461729542666SMaharaja Kennadyrajan if (num_chains <= num_streams) 461829542666SMaharaja Kennadyrajan goto out; 461929542666SMaharaja Kennadyrajan 462029542666SMaharaja Kennadyrajan switch (type) { 462129542666SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_STBC: 462229542666SMaharaja Kennadyrajan tpc = min_t(u8, tpc, 462329542666SMaharaja Kennadyrajan ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]); 462429542666SMaharaja Kennadyrajan break; 462529542666SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_TXBF: 462629542666SMaharaja Kennadyrajan tpc = min_t(u8, tpc, 462729542666SMaharaja Kennadyrajan ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]); 462829542666SMaharaja Kennadyrajan break; 462929542666SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_CDD: 463029542666SMaharaja Kennadyrajan tpc = min_t(u8, tpc, 463129542666SMaharaja Kennadyrajan ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]); 463229542666SMaharaja Kennadyrajan break; 463329542666SMaharaja Kennadyrajan default: 463429542666SMaharaja Kennadyrajan ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type); 463529542666SMaharaja Kennadyrajan tpc = 0; 463629542666SMaharaja Kennadyrajan break; 463729542666SMaharaja Kennadyrajan } 463829542666SMaharaja Kennadyrajan 463929542666SMaharaja Kennadyrajan out: 464029542666SMaharaja Kennadyrajan return tpc; 464129542666SMaharaja Kennadyrajan } 464229542666SMaharaja Kennadyrajan 464329542666SMaharaja Kennadyrajan static void ath10k_tpc_config_disp_tables(struct ath10k *ar, 464429542666SMaharaja Kennadyrajan struct wmi_pdev_tpc_config_event *ev, 464529542666SMaharaja Kennadyrajan struct ath10k_tpc_stats *tpc_stats, 464629542666SMaharaja Kennadyrajan u8 *rate_code, u16 *pream_table, u8 type) 464729542666SMaharaja Kennadyrajan { 464829542666SMaharaja Kennadyrajan u32 i, j, pream_idx, flags; 464929542666SMaharaja Kennadyrajan u8 tpc[WMI_TPC_TX_N_CHAIN]; 465029542666SMaharaja Kennadyrajan char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE]; 465129542666SMaharaja Kennadyrajan char buff[WMI_TPC_BUF_SIZE]; 465229542666SMaharaja Kennadyrajan 465329542666SMaharaja Kennadyrajan flags = __le32_to_cpu(ev->flags); 465429542666SMaharaja Kennadyrajan 465529542666SMaharaja Kennadyrajan switch (type) { 465629542666SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_CDD: 465729542666SMaharaja Kennadyrajan if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) { 465829542666SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n"); 465929542666SMaharaja Kennadyrajan tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 466029542666SMaharaja Kennadyrajan return; 466129542666SMaharaja Kennadyrajan } 466229542666SMaharaja Kennadyrajan break; 466329542666SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_STBC: 466429542666SMaharaja Kennadyrajan if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) { 466529542666SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n"); 466629542666SMaharaja Kennadyrajan tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 466729542666SMaharaja Kennadyrajan return; 466829542666SMaharaja Kennadyrajan } 466929542666SMaharaja Kennadyrajan break; 467029542666SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_TXBF: 467129542666SMaharaja Kennadyrajan if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) { 467229542666SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n"); 467329542666SMaharaja Kennadyrajan tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 467429542666SMaharaja Kennadyrajan return; 467529542666SMaharaja Kennadyrajan } 467629542666SMaharaja Kennadyrajan break; 467729542666SMaharaja Kennadyrajan default: 467829542666SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, 467929542666SMaharaja Kennadyrajan "invalid table type in wmi tpc event: %d\n", type); 468029542666SMaharaja Kennadyrajan return; 468129542666SMaharaja Kennadyrajan } 468229542666SMaharaja Kennadyrajan 468329542666SMaharaja Kennadyrajan pream_idx = 0; 468429542666SMaharaja Kennadyrajan for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) { 468529542666SMaharaja Kennadyrajan memset(tpc_value, 0, sizeof(tpc_value)); 468629542666SMaharaja Kennadyrajan memset(buff, 0, sizeof(buff)); 468729542666SMaharaja Kennadyrajan if (i == pream_table[pream_idx]) 468829542666SMaharaja Kennadyrajan pream_idx++; 468929542666SMaharaja Kennadyrajan 469029542666SMaharaja Kennadyrajan for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) { 469129542666SMaharaja Kennadyrajan if (j >= __le32_to_cpu(ev->num_tx_chain)) 469229542666SMaharaja Kennadyrajan break; 469329542666SMaharaja Kennadyrajan 469429542666SMaharaja Kennadyrajan tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1, 469529542666SMaharaja Kennadyrajan rate_code[i], 469629542666SMaharaja Kennadyrajan type); 469729542666SMaharaja Kennadyrajan snprintf(buff, sizeof(buff), "%8d ", tpc[j]); 46986707ba01SArnd Bergmann strlcat(tpc_value, buff, sizeof(tpc_value)); 469929542666SMaharaja Kennadyrajan } 470029542666SMaharaja Kennadyrajan tpc_stats->tpc_table[type].pream_idx[i] = pream_idx; 470129542666SMaharaja Kennadyrajan tpc_stats->tpc_table[type].rate_code[i] = rate_code[i]; 470229542666SMaharaja Kennadyrajan memcpy(tpc_stats->tpc_table[type].tpc_value[i], 470329542666SMaharaja Kennadyrajan tpc_value, sizeof(tpc_value)); 470429542666SMaharaja Kennadyrajan } 470529542666SMaharaja Kennadyrajan } 470629542666SMaharaja Kennadyrajan 4707bc64d052SMaharaja Kennadyrajan void ath10k_wmi_tpc_config_get_rate_code(u8 *rate_code, u16 *pream_table, 4708bc64d052SMaharaja Kennadyrajan u32 num_tx_chain) 47095e3dd157SKalle Valo { 4710bc64d052SMaharaja Kennadyrajan u32 i, j, pream_idx; 4711bc64d052SMaharaja Kennadyrajan u8 rate_idx; 471229542666SMaharaja Kennadyrajan 471329542666SMaharaja Kennadyrajan /* Create the rate code table based on the chains supported */ 471429542666SMaharaja Kennadyrajan rate_idx = 0; 471529542666SMaharaja Kennadyrajan pream_idx = 0; 471629542666SMaharaja Kennadyrajan 471729542666SMaharaja Kennadyrajan /* Fill CCK rate code */ 471829542666SMaharaja Kennadyrajan for (i = 0; i < 4; i++) { 471929542666SMaharaja Kennadyrajan rate_code[rate_idx] = 472029542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_CCK); 472129542666SMaharaja Kennadyrajan rate_idx++; 472229542666SMaharaja Kennadyrajan } 472329542666SMaharaja Kennadyrajan pream_table[pream_idx] = rate_idx; 472429542666SMaharaja Kennadyrajan pream_idx++; 472529542666SMaharaja Kennadyrajan 472629542666SMaharaja Kennadyrajan /* Fill OFDM rate code */ 472729542666SMaharaja Kennadyrajan for (i = 0; i < 8; i++) { 472829542666SMaharaja Kennadyrajan rate_code[rate_idx] = 472929542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(i, 0, WMI_RATE_PREAMBLE_OFDM); 473029542666SMaharaja Kennadyrajan rate_idx++; 473129542666SMaharaja Kennadyrajan } 473229542666SMaharaja Kennadyrajan pream_table[pream_idx] = rate_idx; 473329542666SMaharaja Kennadyrajan pream_idx++; 473429542666SMaharaja Kennadyrajan 473529542666SMaharaja Kennadyrajan /* Fill HT20 rate code */ 473629542666SMaharaja Kennadyrajan for (i = 0; i < num_tx_chain; i++) { 473729542666SMaharaja Kennadyrajan for (j = 0; j < 8; j++) { 473829542666SMaharaja Kennadyrajan rate_code[rate_idx] = 473929542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT); 474029542666SMaharaja Kennadyrajan rate_idx++; 474129542666SMaharaja Kennadyrajan } 474229542666SMaharaja Kennadyrajan } 474329542666SMaharaja Kennadyrajan pream_table[pream_idx] = rate_idx; 474429542666SMaharaja Kennadyrajan pream_idx++; 474529542666SMaharaja Kennadyrajan 474629542666SMaharaja Kennadyrajan /* Fill HT40 rate code */ 474729542666SMaharaja Kennadyrajan for (i = 0; i < num_tx_chain; i++) { 474829542666SMaharaja Kennadyrajan for (j = 0; j < 8; j++) { 474929542666SMaharaja Kennadyrajan rate_code[rate_idx] = 475029542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_HT); 475129542666SMaharaja Kennadyrajan rate_idx++; 475229542666SMaharaja Kennadyrajan } 475329542666SMaharaja Kennadyrajan } 475429542666SMaharaja Kennadyrajan pream_table[pream_idx] = rate_idx; 475529542666SMaharaja Kennadyrajan pream_idx++; 475629542666SMaharaja Kennadyrajan 475729542666SMaharaja Kennadyrajan /* Fill VHT20 rate code */ 4758bc64d052SMaharaja Kennadyrajan for (i = 0; i < num_tx_chain; i++) { 475929542666SMaharaja Kennadyrajan for (j = 0; j < 10; j++) { 476029542666SMaharaja Kennadyrajan rate_code[rate_idx] = 476129542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT); 476229542666SMaharaja Kennadyrajan rate_idx++; 476329542666SMaharaja Kennadyrajan } 476429542666SMaharaja Kennadyrajan } 476529542666SMaharaja Kennadyrajan pream_table[pream_idx] = rate_idx; 476629542666SMaharaja Kennadyrajan pream_idx++; 476729542666SMaharaja Kennadyrajan 476829542666SMaharaja Kennadyrajan /* Fill VHT40 rate code */ 476929542666SMaharaja Kennadyrajan for (i = 0; i < num_tx_chain; i++) { 477029542666SMaharaja Kennadyrajan for (j = 0; j < 10; j++) { 477129542666SMaharaja Kennadyrajan rate_code[rate_idx] = 477229542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT); 477329542666SMaharaja Kennadyrajan rate_idx++; 477429542666SMaharaja Kennadyrajan } 477529542666SMaharaja Kennadyrajan } 477629542666SMaharaja Kennadyrajan pream_table[pream_idx] = rate_idx; 477729542666SMaharaja Kennadyrajan pream_idx++; 477829542666SMaharaja Kennadyrajan 477929542666SMaharaja Kennadyrajan /* Fill VHT80 rate code */ 478029542666SMaharaja Kennadyrajan for (i = 0; i < num_tx_chain; i++) { 478129542666SMaharaja Kennadyrajan for (j = 0; j < 10; j++) { 478229542666SMaharaja Kennadyrajan rate_code[rate_idx] = 478329542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(j, i, WMI_RATE_PREAMBLE_VHT); 478429542666SMaharaja Kennadyrajan rate_idx++; 478529542666SMaharaja Kennadyrajan } 478629542666SMaharaja Kennadyrajan } 478729542666SMaharaja Kennadyrajan pream_table[pream_idx] = rate_idx; 478829542666SMaharaja Kennadyrajan pream_idx++; 478929542666SMaharaja Kennadyrajan 479029542666SMaharaja Kennadyrajan rate_code[rate_idx++] = 479129542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK); 479229542666SMaharaja Kennadyrajan rate_code[rate_idx++] = 479329542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM); 479429542666SMaharaja Kennadyrajan rate_code[rate_idx++] = 479529542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_CCK); 479629542666SMaharaja Kennadyrajan rate_code[rate_idx++] = 479729542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM); 479829542666SMaharaja Kennadyrajan rate_code[rate_idx++] = 479929542666SMaharaja Kennadyrajan ATH10K_HW_RATECODE(0, 0, WMI_RATE_PREAMBLE_OFDM); 480029542666SMaharaja Kennadyrajan 480129542666SMaharaja Kennadyrajan pream_table[pream_idx] = ATH10K_TPC_PREAM_TABLE_END; 4802bc64d052SMaharaja Kennadyrajan } 4803bc64d052SMaharaja Kennadyrajan 4804bc64d052SMaharaja Kennadyrajan void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb) 4805bc64d052SMaharaja Kennadyrajan { 4806bc64d052SMaharaja Kennadyrajan u32 num_tx_chain; 4807bc64d052SMaharaja Kennadyrajan u8 rate_code[WMI_TPC_RATE_MAX]; 4808bc64d052SMaharaja Kennadyrajan u16 pream_table[WMI_TPC_PREAM_TABLE_MAX]; 4809bc64d052SMaharaja Kennadyrajan struct wmi_pdev_tpc_config_event *ev; 4810bc64d052SMaharaja Kennadyrajan struct ath10k_tpc_stats *tpc_stats; 4811bc64d052SMaharaja Kennadyrajan 4812bc64d052SMaharaja Kennadyrajan ev = (struct wmi_pdev_tpc_config_event *)skb->data; 4813bc64d052SMaharaja Kennadyrajan 4814bc64d052SMaharaja Kennadyrajan num_tx_chain = __le32_to_cpu(ev->num_tx_chain); 4815bc64d052SMaharaja Kennadyrajan 48164b190675STamizh Chelvam if (num_tx_chain > WMI_TPC_TX_N_CHAIN) { 48174b190675STamizh Chelvam ath10k_warn(ar, "number of tx chain is %d greater than TPC configured tx chain %d\n", 48184b190675STamizh Chelvam num_tx_chain, WMI_TPC_TX_N_CHAIN); 48194b190675STamizh Chelvam return; 48204b190675STamizh Chelvam } 48214b190675STamizh Chelvam 4822260e629bSColin Ian King tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC); 4823260e629bSColin Ian King if (!tpc_stats) 4824260e629bSColin Ian King return; 4825260e629bSColin Ian King 4826bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table, 4827bc64d052SMaharaja Kennadyrajan num_tx_chain); 482829542666SMaharaja Kennadyrajan 482929542666SMaharaja Kennadyrajan tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq); 483029542666SMaharaja Kennadyrajan tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode); 483129542666SMaharaja Kennadyrajan tpc_stats->ctl = __le32_to_cpu(ev->ctl); 483229542666SMaharaja Kennadyrajan tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain); 483329542666SMaharaja Kennadyrajan tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain); 483429542666SMaharaja Kennadyrajan tpc_stats->twice_antenna_reduction = 483529542666SMaharaja Kennadyrajan __le32_to_cpu(ev->twice_antenna_reduction); 483629542666SMaharaja Kennadyrajan tpc_stats->power_limit = __le32_to_cpu(ev->power_limit); 483729542666SMaharaja Kennadyrajan tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power); 483829542666SMaharaja Kennadyrajan tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain); 483929542666SMaharaja Kennadyrajan tpc_stats->rate_max = __le32_to_cpu(ev->rate_max); 484029542666SMaharaja Kennadyrajan 484129542666SMaharaja Kennadyrajan ath10k_tpc_config_disp_tables(ar, ev, tpc_stats, 484229542666SMaharaja Kennadyrajan rate_code, pream_table, 484329542666SMaharaja Kennadyrajan WMI_TPC_TABLE_TYPE_CDD); 484429542666SMaharaja Kennadyrajan ath10k_tpc_config_disp_tables(ar, ev, tpc_stats, 484529542666SMaharaja Kennadyrajan rate_code, pream_table, 484629542666SMaharaja Kennadyrajan WMI_TPC_TABLE_TYPE_STBC); 484729542666SMaharaja Kennadyrajan ath10k_tpc_config_disp_tables(ar, ev, tpc_stats, 484829542666SMaharaja Kennadyrajan rate_code, pream_table, 484929542666SMaharaja Kennadyrajan WMI_TPC_TABLE_TYPE_TXBF); 485029542666SMaharaja Kennadyrajan 485129542666SMaharaja Kennadyrajan ath10k_debug_tpc_stats_process(ar, tpc_stats); 485229542666SMaharaja Kennadyrajan 485329542666SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, 485429542666SMaharaja Kennadyrajan "wmi event tpc config channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n", 485529542666SMaharaja Kennadyrajan __le32_to_cpu(ev->chan_freq), 485629542666SMaharaja Kennadyrajan __le32_to_cpu(ev->phy_mode), 485729542666SMaharaja Kennadyrajan __le32_to_cpu(ev->ctl), 485829542666SMaharaja Kennadyrajan __le32_to_cpu(ev->reg_domain), 485929542666SMaharaja Kennadyrajan a_sle32_to_cpu(ev->twice_antenna_gain), 486029542666SMaharaja Kennadyrajan __le32_to_cpu(ev->twice_antenna_reduction), 486129542666SMaharaja Kennadyrajan __le32_to_cpu(ev->power_limit), 486229542666SMaharaja Kennadyrajan __le32_to_cpu(ev->twice_max_rd_power) / 2, 486329542666SMaharaja Kennadyrajan __le32_to_cpu(ev->num_tx_chain), 486429542666SMaharaja Kennadyrajan __le32_to_cpu(ev->rate_max)); 48655e3dd157SKalle Valo } 48665e3dd157SKalle Valo 4867bc64d052SMaharaja Kennadyrajan static u8 4868bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_final_get_rate(struct ath10k *ar, 4869bc64d052SMaharaja Kennadyrajan struct wmi_pdev_tpc_final_table_event *ev, 4870bc64d052SMaharaja Kennadyrajan u32 rate_idx, u32 num_chains, 4871bc64d052SMaharaja Kennadyrajan u32 rate_code, u8 type, u32 pream_idx) 4872bc64d052SMaharaja Kennadyrajan { 4873bc64d052SMaharaja Kennadyrajan u8 tpc, num_streams, preamble, ch, stm_idx; 4874bc64d052SMaharaja Kennadyrajan s8 pow_agcdd, pow_agstbc, pow_agtxbf; 4875bc64d052SMaharaja Kennadyrajan int pream; 4876bc64d052SMaharaja Kennadyrajan 4877bc64d052SMaharaja Kennadyrajan num_streams = ATH10K_HW_NSS(rate_code); 4878bc64d052SMaharaja Kennadyrajan preamble = ATH10K_HW_PREAMBLE(rate_code); 4879bc64d052SMaharaja Kennadyrajan ch = num_chains - 1; 4880bc64d052SMaharaja Kennadyrajan stm_idx = num_streams - 1; 4881bc64d052SMaharaja Kennadyrajan pream = -1; 4882bc64d052SMaharaja Kennadyrajan 4883bc64d052SMaharaja Kennadyrajan if (__le32_to_cpu(ev->chan_freq) <= 2483) { 4884bc64d052SMaharaja Kennadyrajan switch (pream_idx) { 4885bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_2GHZ_CCK: 4886bc64d052SMaharaja Kennadyrajan pream = 0; 4887bc64d052SMaharaja Kennadyrajan break; 4888bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_2GHZ_OFDM: 4889bc64d052SMaharaja Kennadyrajan pream = 1; 4890bc64d052SMaharaja Kennadyrajan break; 4891bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_2GHZ_HT20: 4892bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_2GHZ_VHT20: 4893bc64d052SMaharaja Kennadyrajan pream = 2; 4894bc64d052SMaharaja Kennadyrajan break; 4895bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_2GHZ_HT40: 4896bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_2GHZ_VHT40: 4897bc64d052SMaharaja Kennadyrajan pream = 3; 4898bc64d052SMaharaja Kennadyrajan break; 4899bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_2GHZ_VHT80: 4900bc64d052SMaharaja Kennadyrajan pream = 4; 4901bc64d052SMaharaja Kennadyrajan break; 4902bc64d052SMaharaja Kennadyrajan default: 4903bc64d052SMaharaja Kennadyrajan pream = -1; 4904bc64d052SMaharaja Kennadyrajan break; 4905bc64d052SMaharaja Kennadyrajan } 4906bc64d052SMaharaja Kennadyrajan } 4907bc64d052SMaharaja Kennadyrajan 4908bc64d052SMaharaja Kennadyrajan if (__le32_to_cpu(ev->chan_freq) >= 5180) { 4909bc64d052SMaharaja Kennadyrajan switch (pream_idx) { 4910bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_5GHZ_OFDM: 4911bc64d052SMaharaja Kennadyrajan pream = 0; 4912bc64d052SMaharaja Kennadyrajan break; 4913bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_5GHZ_HT20: 4914bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_5GHZ_VHT20: 4915bc64d052SMaharaja Kennadyrajan pream = 1; 4916bc64d052SMaharaja Kennadyrajan break; 4917bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_5GHZ_HT40: 4918bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_5GHZ_VHT40: 4919bc64d052SMaharaja Kennadyrajan pream = 2; 4920bc64d052SMaharaja Kennadyrajan break; 4921bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_5GHZ_VHT80: 4922bc64d052SMaharaja Kennadyrajan pream = 3; 4923bc64d052SMaharaja Kennadyrajan break; 4924bc64d052SMaharaja Kennadyrajan case WMI_TPC_PREAM_5GHZ_HTCUP: 4925bc64d052SMaharaja Kennadyrajan pream = 4; 4926bc64d052SMaharaja Kennadyrajan break; 4927bc64d052SMaharaja Kennadyrajan default: 4928bc64d052SMaharaja Kennadyrajan pream = -1; 4929bc64d052SMaharaja Kennadyrajan break; 4930bc64d052SMaharaja Kennadyrajan } 4931bc64d052SMaharaja Kennadyrajan } 4932bc64d052SMaharaja Kennadyrajan 493397c69a70SK.T.VIJAYAKUMAAR if (pream == -1) { 493497c69a70SK.T.VIJAYAKUMAAR ath10k_warn(ar, "unknown wmi tpc final index and frequency: %u, %u\n", 493597c69a70SK.T.VIJAYAKUMAAR pream_idx, __le32_to_cpu(ev->chan_freq)); 493697c69a70SK.T.VIJAYAKUMAAR tpc = 0; 493797c69a70SK.T.VIJAYAKUMAAR goto out; 493897c69a70SK.T.VIJAYAKUMAAR } 493997c69a70SK.T.VIJAYAKUMAAR 4940bc64d052SMaharaja Kennadyrajan if (pream == 4) 4941bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, ev->rates_array[rate_idx], 4942bc64d052SMaharaja Kennadyrajan ev->max_reg_allow_pow[ch]); 4943bc64d052SMaharaja Kennadyrajan else 4944bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, min_t(u8, ev->rates_array[rate_idx], 4945bc64d052SMaharaja Kennadyrajan ev->max_reg_allow_pow[ch]), 4946bc64d052SMaharaja Kennadyrajan ev->ctl_power_table[0][pream][stm_idx]); 4947bc64d052SMaharaja Kennadyrajan 4948bc64d052SMaharaja Kennadyrajan if (__le32_to_cpu(ev->num_tx_chain) <= 1) 4949bc64d052SMaharaja Kennadyrajan goto out; 4950bc64d052SMaharaja Kennadyrajan 4951bc64d052SMaharaja Kennadyrajan if (preamble == WMI_RATE_PREAMBLE_CCK) 4952bc64d052SMaharaja Kennadyrajan goto out; 4953bc64d052SMaharaja Kennadyrajan 4954bc64d052SMaharaja Kennadyrajan if (num_chains <= num_streams) 4955bc64d052SMaharaja Kennadyrajan goto out; 4956bc64d052SMaharaja Kennadyrajan 4957bc64d052SMaharaja Kennadyrajan switch (type) { 4958bc64d052SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_STBC: 4959bc64d052SMaharaja Kennadyrajan pow_agstbc = ev->max_reg_allow_pow_agstbc[ch - 1][stm_idx]; 4960bc64d052SMaharaja Kennadyrajan if (pream == 4) 4961bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, tpc, pow_agstbc); 4962bc64d052SMaharaja Kennadyrajan else 4963bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, min_t(u8, tpc, pow_agstbc), 4964bc64d052SMaharaja Kennadyrajan ev->ctl_power_table[0][pream][stm_idx]); 4965bc64d052SMaharaja Kennadyrajan break; 4966bc64d052SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_TXBF: 4967bc64d052SMaharaja Kennadyrajan pow_agtxbf = ev->max_reg_allow_pow_agtxbf[ch - 1][stm_idx]; 4968bc64d052SMaharaja Kennadyrajan if (pream == 4) 4969bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, tpc, pow_agtxbf); 4970bc64d052SMaharaja Kennadyrajan else 4971bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, min_t(u8, tpc, pow_agtxbf), 4972bc64d052SMaharaja Kennadyrajan ev->ctl_power_table[1][pream][stm_idx]); 4973bc64d052SMaharaja Kennadyrajan break; 4974bc64d052SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_CDD: 4975bc64d052SMaharaja Kennadyrajan pow_agcdd = ev->max_reg_allow_pow_agcdd[ch - 1][stm_idx]; 4976bc64d052SMaharaja Kennadyrajan if (pream == 4) 4977bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, tpc, pow_agcdd); 4978bc64d052SMaharaja Kennadyrajan else 4979bc64d052SMaharaja Kennadyrajan tpc = min_t(u8, min_t(u8, tpc, pow_agcdd), 4980bc64d052SMaharaja Kennadyrajan ev->ctl_power_table[0][pream][stm_idx]); 4981bc64d052SMaharaja Kennadyrajan break; 4982bc64d052SMaharaja Kennadyrajan default: 4983bc64d052SMaharaja Kennadyrajan ath10k_warn(ar, "unknown wmi tpc final table type: %d\n", type); 4984bc64d052SMaharaja Kennadyrajan tpc = 0; 4985bc64d052SMaharaja Kennadyrajan break; 4986bc64d052SMaharaja Kennadyrajan } 4987bc64d052SMaharaja Kennadyrajan 4988bc64d052SMaharaja Kennadyrajan out: 4989bc64d052SMaharaja Kennadyrajan return tpc; 4990bc64d052SMaharaja Kennadyrajan } 4991bc64d052SMaharaja Kennadyrajan 4992bc64d052SMaharaja Kennadyrajan static void 4993bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_stats_final_disp_tables(struct ath10k *ar, 4994bc64d052SMaharaja Kennadyrajan struct wmi_pdev_tpc_final_table_event *ev, 4995bc64d052SMaharaja Kennadyrajan struct ath10k_tpc_stats_final *tpc_stats, 4996bc64d052SMaharaja Kennadyrajan u8 *rate_code, u16 *pream_table, u8 type) 4997bc64d052SMaharaja Kennadyrajan { 4998bc64d052SMaharaja Kennadyrajan u32 i, j, pream_idx, flags; 4999bc64d052SMaharaja Kennadyrajan u8 tpc[WMI_TPC_TX_N_CHAIN]; 5000bc64d052SMaharaja Kennadyrajan char tpc_value[WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE]; 5001bc64d052SMaharaja Kennadyrajan char buff[WMI_TPC_BUF_SIZE]; 5002bc64d052SMaharaja Kennadyrajan 5003bc64d052SMaharaja Kennadyrajan flags = __le32_to_cpu(ev->flags); 5004bc64d052SMaharaja Kennadyrajan 5005bc64d052SMaharaja Kennadyrajan switch (type) { 5006bc64d052SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_CDD: 5007bc64d052SMaharaja Kennadyrajan if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_CDD)) { 5008bc64d052SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n"); 5009bc64d052SMaharaja Kennadyrajan tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 5010bc64d052SMaharaja Kennadyrajan return; 5011bc64d052SMaharaja Kennadyrajan } 5012bc64d052SMaharaja Kennadyrajan break; 5013bc64d052SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_STBC: 5014bc64d052SMaharaja Kennadyrajan if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_STBC)) { 5015bc64d052SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n"); 5016bc64d052SMaharaja Kennadyrajan tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 5017bc64d052SMaharaja Kennadyrajan return; 5018bc64d052SMaharaja Kennadyrajan } 5019bc64d052SMaharaja Kennadyrajan break; 5020bc64d052SMaharaja Kennadyrajan case WMI_TPC_TABLE_TYPE_TXBF: 5021bc64d052SMaharaja Kennadyrajan if (!(flags & WMI_TPC_CONFIG_EVENT_FLAG_TABLE_TXBF)) { 5022bc64d052SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n"); 5023bc64d052SMaharaja Kennadyrajan tpc_stats->flag[type] = ATH10K_TPC_TABLE_TYPE_FLAG; 5024bc64d052SMaharaja Kennadyrajan return; 5025bc64d052SMaharaja Kennadyrajan } 5026bc64d052SMaharaja Kennadyrajan break; 5027bc64d052SMaharaja Kennadyrajan default: 5028bc64d052SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, 5029bc64d052SMaharaja Kennadyrajan "invalid table type in wmi tpc event: %d\n", type); 5030bc64d052SMaharaja Kennadyrajan return; 5031bc64d052SMaharaja Kennadyrajan } 5032bc64d052SMaharaja Kennadyrajan 5033bc64d052SMaharaja Kennadyrajan pream_idx = 0; 5034bc64d052SMaharaja Kennadyrajan for (i = 0; i < __le32_to_cpu(ev->rate_max); i++) { 5035bc64d052SMaharaja Kennadyrajan memset(tpc_value, 0, sizeof(tpc_value)); 5036bc64d052SMaharaja Kennadyrajan memset(buff, 0, sizeof(buff)); 5037bc64d052SMaharaja Kennadyrajan if (i == pream_table[pream_idx]) 5038bc64d052SMaharaja Kennadyrajan pream_idx++; 5039bc64d052SMaharaja Kennadyrajan 5040bc64d052SMaharaja Kennadyrajan for (j = 0; j < WMI_TPC_TX_N_CHAIN; j++) { 5041bc64d052SMaharaja Kennadyrajan if (j >= __le32_to_cpu(ev->num_tx_chain)) 5042bc64d052SMaharaja Kennadyrajan break; 5043bc64d052SMaharaja Kennadyrajan 5044bc64d052SMaharaja Kennadyrajan tpc[j] = ath10k_wmi_tpc_final_get_rate(ar, ev, i, j + 1, 5045bc64d052SMaharaja Kennadyrajan rate_code[i], 5046bc64d052SMaharaja Kennadyrajan type, pream_idx); 5047bc64d052SMaharaja Kennadyrajan snprintf(buff, sizeof(buff), "%8d ", tpc[j]); 50486707ba01SArnd Bergmann strlcat(tpc_value, buff, sizeof(tpc_value)); 5049bc64d052SMaharaja Kennadyrajan } 5050bc64d052SMaharaja Kennadyrajan tpc_stats->tpc_table_final[type].pream_idx[i] = pream_idx; 5051bc64d052SMaharaja Kennadyrajan tpc_stats->tpc_table_final[type].rate_code[i] = rate_code[i]; 5052bc64d052SMaharaja Kennadyrajan memcpy(tpc_stats->tpc_table_final[type].tpc_value[i], 5053bc64d052SMaharaja Kennadyrajan tpc_value, sizeof(tpc_value)); 5054bc64d052SMaharaja Kennadyrajan } 5055bc64d052SMaharaja Kennadyrajan } 5056bc64d052SMaharaja Kennadyrajan 5057bc64d052SMaharaja Kennadyrajan void ath10k_wmi_event_tpc_final_table(struct ath10k *ar, struct sk_buff *skb) 5058bc64d052SMaharaja Kennadyrajan { 5059bc64d052SMaharaja Kennadyrajan u32 num_tx_chain; 5060bc64d052SMaharaja Kennadyrajan u8 rate_code[WMI_TPC_FINAL_RATE_MAX]; 5061bc64d052SMaharaja Kennadyrajan u16 pream_table[WMI_TPC_PREAM_TABLE_MAX]; 5062bc64d052SMaharaja Kennadyrajan struct wmi_pdev_tpc_final_table_event *ev; 5063bc64d052SMaharaja Kennadyrajan struct ath10k_tpc_stats_final *tpc_stats; 5064bc64d052SMaharaja Kennadyrajan 5065bc64d052SMaharaja Kennadyrajan ev = (struct wmi_pdev_tpc_final_table_event *)skb->data; 5066bc64d052SMaharaja Kennadyrajan 5067bc64d052SMaharaja Kennadyrajan tpc_stats = kzalloc(sizeof(*tpc_stats), GFP_ATOMIC); 5068bc64d052SMaharaja Kennadyrajan if (!tpc_stats) 5069bc64d052SMaharaja Kennadyrajan return; 5070bc64d052SMaharaja Kennadyrajan 5071bc64d052SMaharaja Kennadyrajan num_tx_chain = __le32_to_cpu(ev->num_tx_chain); 5072bc64d052SMaharaja Kennadyrajan 5073bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_config_get_rate_code(rate_code, pream_table, 5074bc64d052SMaharaja Kennadyrajan num_tx_chain); 5075bc64d052SMaharaja Kennadyrajan 5076bc64d052SMaharaja Kennadyrajan tpc_stats->chan_freq = __le32_to_cpu(ev->chan_freq); 5077bc64d052SMaharaja Kennadyrajan tpc_stats->phy_mode = __le32_to_cpu(ev->phy_mode); 5078bc64d052SMaharaja Kennadyrajan tpc_stats->ctl = __le32_to_cpu(ev->ctl); 5079bc64d052SMaharaja Kennadyrajan tpc_stats->reg_domain = __le32_to_cpu(ev->reg_domain); 5080bc64d052SMaharaja Kennadyrajan tpc_stats->twice_antenna_gain = a_sle32_to_cpu(ev->twice_antenna_gain); 5081bc64d052SMaharaja Kennadyrajan tpc_stats->twice_antenna_reduction = 5082bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->twice_antenna_reduction); 5083bc64d052SMaharaja Kennadyrajan tpc_stats->power_limit = __le32_to_cpu(ev->power_limit); 5084bc64d052SMaharaja Kennadyrajan tpc_stats->twice_max_rd_power = __le32_to_cpu(ev->twice_max_rd_power); 5085bc64d052SMaharaja Kennadyrajan tpc_stats->num_tx_chain = __le32_to_cpu(ev->num_tx_chain); 5086bc64d052SMaharaja Kennadyrajan tpc_stats->rate_max = __le32_to_cpu(ev->rate_max); 5087bc64d052SMaharaja Kennadyrajan 5088bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats, 5089bc64d052SMaharaja Kennadyrajan rate_code, pream_table, 5090bc64d052SMaharaja Kennadyrajan WMI_TPC_TABLE_TYPE_CDD); 5091bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats, 5092bc64d052SMaharaja Kennadyrajan rate_code, pream_table, 5093bc64d052SMaharaja Kennadyrajan WMI_TPC_TABLE_TYPE_STBC); 5094bc64d052SMaharaja Kennadyrajan ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats, 5095bc64d052SMaharaja Kennadyrajan rate_code, pream_table, 5096bc64d052SMaharaja Kennadyrajan WMI_TPC_TABLE_TYPE_TXBF); 5097bc64d052SMaharaja Kennadyrajan 5098bc64d052SMaharaja Kennadyrajan ath10k_debug_tpc_stats_final_process(ar, tpc_stats); 5099bc64d052SMaharaja Kennadyrajan 5100bc64d052SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, 5101bc64d052SMaharaja Kennadyrajan "wmi event tpc final table channel %d mode %d ctl %d regd %d gain %d %d limit %d max_power %d tx_chanins %d rates %d\n", 5102bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->chan_freq), 5103bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->phy_mode), 5104bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->ctl), 5105bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->reg_domain), 5106bc64d052SMaharaja Kennadyrajan a_sle32_to_cpu(ev->twice_antenna_gain), 5107bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->twice_antenna_reduction), 5108bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->power_limit), 5109bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->twice_max_rd_power) / 2, 5110bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->num_tx_chain), 5111bc64d052SMaharaja Kennadyrajan __le32_to_cpu(ev->rate_max)); 5112bc64d052SMaharaja Kennadyrajan } 5113bc64d052SMaharaja Kennadyrajan 51148ed05ed0SManikanta Pubbisetty static void 51158ed05ed0SManikanta Pubbisetty ath10k_wmi_handle_tdls_peer_event(struct ath10k *ar, struct sk_buff *skb) 51168ed05ed0SManikanta Pubbisetty { 51178ed05ed0SManikanta Pubbisetty struct wmi_tdls_peer_event *ev; 51188ed05ed0SManikanta Pubbisetty struct ath10k_peer *peer; 51198ed05ed0SManikanta Pubbisetty struct ath10k_vif *arvif; 51208ed05ed0SManikanta Pubbisetty int vdev_id; 51218ed05ed0SManikanta Pubbisetty int peer_status; 51228ed05ed0SManikanta Pubbisetty int peer_reason; 51238ed05ed0SManikanta Pubbisetty u8 reason; 51248ed05ed0SManikanta Pubbisetty 51258ed05ed0SManikanta Pubbisetty if (skb->len < sizeof(*ev)) { 51268ed05ed0SManikanta Pubbisetty ath10k_err(ar, "received tdls peer event with invalid size (%d bytes)\n", 51278ed05ed0SManikanta Pubbisetty skb->len); 51288ed05ed0SManikanta Pubbisetty return; 51298ed05ed0SManikanta Pubbisetty } 51308ed05ed0SManikanta Pubbisetty 51318ed05ed0SManikanta Pubbisetty ev = (struct wmi_tdls_peer_event *)skb->data; 51328ed05ed0SManikanta Pubbisetty vdev_id = __le32_to_cpu(ev->vdev_id); 51338ed05ed0SManikanta Pubbisetty peer_status = __le32_to_cpu(ev->peer_status); 51348ed05ed0SManikanta Pubbisetty peer_reason = __le32_to_cpu(ev->peer_reason); 51358ed05ed0SManikanta Pubbisetty 51368ed05ed0SManikanta Pubbisetty spin_lock_bh(&ar->data_lock); 51378ed05ed0SManikanta Pubbisetty peer = ath10k_peer_find(ar, vdev_id, ev->peer_macaddr.addr); 51388ed05ed0SManikanta Pubbisetty spin_unlock_bh(&ar->data_lock); 51398ed05ed0SManikanta Pubbisetty 51408ed05ed0SManikanta Pubbisetty if (!peer) { 51418ed05ed0SManikanta Pubbisetty ath10k_warn(ar, "failed to find peer entry for %pM\n", 51428ed05ed0SManikanta Pubbisetty ev->peer_macaddr.addr); 51438ed05ed0SManikanta Pubbisetty return; 51448ed05ed0SManikanta Pubbisetty } 51458ed05ed0SManikanta Pubbisetty 51468ed05ed0SManikanta Pubbisetty switch (peer_status) { 51478ed05ed0SManikanta Pubbisetty case WMI_TDLS_SHOULD_TEARDOWN: 51488ed05ed0SManikanta Pubbisetty switch (peer_reason) { 51498ed05ed0SManikanta Pubbisetty case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT: 51508ed05ed0SManikanta Pubbisetty case WMI_TDLS_TEARDOWN_REASON_NO_RESPONSE: 51518ed05ed0SManikanta Pubbisetty case WMI_TDLS_TEARDOWN_REASON_RSSI: 51528ed05ed0SManikanta Pubbisetty reason = WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE; 51538ed05ed0SManikanta Pubbisetty break; 51548ed05ed0SManikanta Pubbisetty default: 51558ed05ed0SManikanta Pubbisetty reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED; 51568ed05ed0SManikanta Pubbisetty break; 51578ed05ed0SManikanta Pubbisetty } 51588ed05ed0SManikanta Pubbisetty 51598ed05ed0SManikanta Pubbisetty arvif = ath10k_get_arvif(ar, vdev_id); 51608ed05ed0SManikanta Pubbisetty if (!arvif) { 51618ed05ed0SManikanta Pubbisetty ath10k_warn(ar, "received tdls peer event for invalid vdev id %u\n", 51628ed05ed0SManikanta Pubbisetty vdev_id); 51638ed05ed0SManikanta Pubbisetty return; 51648ed05ed0SManikanta Pubbisetty } 51658ed05ed0SManikanta Pubbisetty 51668ed05ed0SManikanta Pubbisetty ieee80211_tdls_oper_request(arvif->vif, ev->peer_macaddr.addr, 51678ed05ed0SManikanta Pubbisetty NL80211_TDLS_TEARDOWN, reason, 51688ed05ed0SManikanta Pubbisetty GFP_ATOMIC); 51698ed05ed0SManikanta Pubbisetty 51708ed05ed0SManikanta Pubbisetty ath10k_dbg(ar, ATH10K_DBG_WMI, 51718ed05ed0SManikanta Pubbisetty "received tdls teardown event for peer %pM reason %u\n", 51728ed05ed0SManikanta Pubbisetty ev->peer_macaddr.addr, peer_reason); 51738ed05ed0SManikanta Pubbisetty break; 51748ed05ed0SManikanta Pubbisetty default: 51758ed05ed0SManikanta Pubbisetty ath10k_dbg(ar, ATH10K_DBG_WMI, 51768ed05ed0SManikanta Pubbisetty "received unknown tdls peer event %u\n", 51778ed05ed0SManikanta Pubbisetty peer_status); 51788ed05ed0SManikanta Pubbisetty break; 51798ed05ed0SManikanta Pubbisetty } 51808ed05ed0SManikanta Pubbisetty } 51818ed05ed0SManikanta Pubbisetty 5182d70c0d46SMaharaja Kennadyrajan static void 5183d70c0d46SMaharaja Kennadyrajan ath10k_wmi_event_peer_sta_ps_state_chg(struct ath10k *ar, struct sk_buff *skb) 5184d70c0d46SMaharaja Kennadyrajan { 5185d70c0d46SMaharaja Kennadyrajan struct wmi_peer_sta_ps_state_chg_event *ev; 5186d70c0d46SMaharaja Kennadyrajan struct ieee80211_sta *sta; 5187d70c0d46SMaharaja Kennadyrajan struct ath10k_sta *arsta; 5188d70c0d46SMaharaja Kennadyrajan u8 peer_addr[ETH_ALEN]; 5189d70c0d46SMaharaja Kennadyrajan 5190d70c0d46SMaharaja Kennadyrajan lockdep_assert_held(&ar->data_lock); 5191d70c0d46SMaharaja Kennadyrajan 5192d70c0d46SMaharaja Kennadyrajan ev = (struct wmi_peer_sta_ps_state_chg_event *)skb->data; 5193d70c0d46SMaharaja Kennadyrajan ether_addr_copy(peer_addr, ev->peer_macaddr.addr); 5194d70c0d46SMaharaja Kennadyrajan 5195d70c0d46SMaharaja Kennadyrajan rcu_read_lock(); 5196d70c0d46SMaharaja Kennadyrajan 5197d70c0d46SMaharaja Kennadyrajan sta = ieee80211_find_sta_by_ifaddr(ar->hw, peer_addr, NULL); 5198d70c0d46SMaharaja Kennadyrajan 5199d70c0d46SMaharaja Kennadyrajan if (!sta) { 5200d70c0d46SMaharaja Kennadyrajan ath10k_warn(ar, "failed to find station entry %pM\n", 5201d70c0d46SMaharaja Kennadyrajan peer_addr); 5202d70c0d46SMaharaja Kennadyrajan goto exit; 5203d70c0d46SMaharaja Kennadyrajan } 5204d70c0d46SMaharaja Kennadyrajan 5205d70c0d46SMaharaja Kennadyrajan arsta = (struct ath10k_sta *)sta->drv_priv; 5206d70c0d46SMaharaja Kennadyrajan arsta->peer_ps_state = __le32_to_cpu(ev->peer_ps_state); 5207d70c0d46SMaharaja Kennadyrajan 5208d70c0d46SMaharaja Kennadyrajan exit: 5209d70c0d46SMaharaja Kennadyrajan rcu_read_unlock(); 5210d70c0d46SMaharaja Kennadyrajan } 5211d70c0d46SMaharaja Kennadyrajan 52120226d602SMichal Kazior void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb) 52135e3dd157SKalle Valo { 52147aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n"); 52155e3dd157SKalle Valo } 52165e3dd157SKalle Valo 52170226d602SMichal Kazior void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb) 52185e3dd157SKalle Valo { 52197aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n"); 52205e3dd157SKalle Valo } 52215e3dd157SKalle Valo 52220226d602SMichal Kazior void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb) 52235e3dd157SKalle Valo { 52247aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n"); 52255e3dd157SKalle Valo } 52265e3dd157SKalle Valo 52270226d602SMichal Kazior void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb) 52285e3dd157SKalle Valo { 52297aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n"); 52305e3dd157SKalle Valo } 52315e3dd157SKalle Valo 52320226d602SMichal Kazior void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb) 52335e3dd157SKalle Valo { 52347aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n"); 52355e3dd157SKalle Valo } 52365e3dd157SKalle Valo 52370226d602SMichal Kazior void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar, 52385e3dd157SKalle Valo struct sk_buff *skb) 52395e3dd157SKalle Valo { 52407aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n"); 52415e3dd157SKalle Valo } 52425e3dd157SKalle Valo 52430226d602SMichal Kazior void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb) 52448a6618b0SBartosz Markowski { 52457aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n"); 52468a6618b0SBartosz Markowski } 52478a6618b0SBartosz Markowski 52480226d602SMichal Kazior void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb) 52498a6618b0SBartosz Markowski { 52507aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n"); 52518a6618b0SBartosz Markowski } 52528a6618b0SBartosz Markowski 52530226d602SMichal Kazior void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb) 52548a6618b0SBartosz Markowski { 52557aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n"); 52568a6618b0SBartosz Markowski } 52578a6618b0SBartosz Markowski 5258b0578865SFelix Fietkau static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id, 5259b3effe61SBartosz Markowski u32 num_units, u32 unit_len) 5260b3effe61SBartosz Markowski { 5261b3effe61SBartosz Markowski dma_addr_t paddr; 526279e68821SAdrian Chadd u32 pool_size; 5263b3effe61SBartosz Markowski int idx = ar->wmi.num_mem_chunks; 526479e68821SAdrian Chadd void *vaddr; 5265b3effe61SBartosz Markowski 5266b3effe61SBartosz Markowski pool_size = num_units * round_up(unit_len, 4); 5267750afb08SLuis Chamberlain vaddr = dma_alloc_coherent(ar->dev, pool_size, &paddr, GFP_KERNEL); 5268b3effe61SBartosz Markowski 5269b0578865SFelix Fietkau if (!vaddr) 5270b0578865SFelix Fietkau return -ENOMEM; 5271b0578865SFelix Fietkau 5272b0578865SFelix Fietkau ar->wmi.mem_chunks[idx].vaddr = vaddr; 5273b3effe61SBartosz Markowski ar->wmi.mem_chunks[idx].paddr = paddr; 5274b3effe61SBartosz Markowski ar->wmi.mem_chunks[idx].len = pool_size; 5275b3effe61SBartosz Markowski ar->wmi.mem_chunks[idx].req_id = req_id; 5276b3effe61SBartosz Markowski ar->wmi.num_mem_chunks++; 5277b3effe61SBartosz Markowski 5278b0578865SFelix Fietkau return num_units; 5279b0578865SFelix Fietkau } 5280b0578865SFelix Fietkau 5281b0578865SFelix Fietkau static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id, 5282b0578865SFelix Fietkau u32 num_units, u32 unit_len) 5283b0578865SFelix Fietkau { 5284b0578865SFelix Fietkau int ret; 5285b0578865SFelix Fietkau 5286b0578865SFelix Fietkau while (num_units) { 5287b0578865SFelix Fietkau ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len); 5288b0578865SFelix Fietkau if (ret < 0) 5289b0578865SFelix Fietkau return ret; 5290b0578865SFelix Fietkau 5291b0578865SFelix Fietkau num_units -= ret; 5292b0578865SFelix Fietkau } 5293b0578865SFelix Fietkau 5294b3effe61SBartosz Markowski return 0; 5295b3effe61SBartosz Markowski } 5296b3effe61SBartosz Markowski 5297a925a376SVasanthakumar Thiagarajan static bool 5298a925a376SVasanthakumar Thiagarajan ath10k_wmi_is_host_mem_allocated(struct ath10k *ar, 5299a925a376SVasanthakumar Thiagarajan const struct wlan_host_mem_req **mem_reqs, 5300a925a376SVasanthakumar Thiagarajan u32 num_mem_reqs) 5301a925a376SVasanthakumar Thiagarajan { 5302a925a376SVasanthakumar Thiagarajan u32 req_id, num_units, unit_size, num_unit_info; 5303a925a376SVasanthakumar Thiagarajan u32 pool_size; 5304a925a376SVasanthakumar Thiagarajan int i, j; 5305a925a376SVasanthakumar Thiagarajan bool found; 5306a925a376SVasanthakumar Thiagarajan 5307a925a376SVasanthakumar Thiagarajan if (ar->wmi.num_mem_chunks != num_mem_reqs) 5308a925a376SVasanthakumar Thiagarajan return false; 5309a925a376SVasanthakumar Thiagarajan 5310a925a376SVasanthakumar Thiagarajan for (i = 0; i < num_mem_reqs; ++i) { 5311a925a376SVasanthakumar Thiagarajan req_id = __le32_to_cpu(mem_reqs[i]->req_id); 5312a925a376SVasanthakumar Thiagarajan num_units = __le32_to_cpu(mem_reqs[i]->num_units); 5313a925a376SVasanthakumar Thiagarajan unit_size = __le32_to_cpu(mem_reqs[i]->unit_size); 5314a925a376SVasanthakumar Thiagarajan num_unit_info = __le32_to_cpu(mem_reqs[i]->num_unit_info); 5315a925a376SVasanthakumar Thiagarajan 5316a925a376SVasanthakumar Thiagarajan if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) { 5317a925a376SVasanthakumar Thiagarajan if (ar->num_active_peers) 5318a925a376SVasanthakumar Thiagarajan num_units = ar->num_active_peers + 1; 5319a925a376SVasanthakumar Thiagarajan else 5320a925a376SVasanthakumar Thiagarajan num_units = ar->max_num_peers + 1; 5321a925a376SVasanthakumar Thiagarajan } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) { 5322a925a376SVasanthakumar Thiagarajan num_units = ar->max_num_peers + 1; 5323a925a376SVasanthakumar Thiagarajan } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) { 5324a925a376SVasanthakumar Thiagarajan num_units = ar->max_num_vdevs + 1; 5325a925a376SVasanthakumar Thiagarajan } 5326a925a376SVasanthakumar Thiagarajan 5327a925a376SVasanthakumar Thiagarajan found = false; 5328a925a376SVasanthakumar Thiagarajan for (j = 0; j < ar->wmi.num_mem_chunks; j++) { 5329a925a376SVasanthakumar Thiagarajan if (ar->wmi.mem_chunks[j].req_id == req_id) { 5330a925a376SVasanthakumar Thiagarajan pool_size = num_units * round_up(unit_size, 4); 5331a925a376SVasanthakumar Thiagarajan if (ar->wmi.mem_chunks[j].len == pool_size) { 5332a925a376SVasanthakumar Thiagarajan found = true; 5333a925a376SVasanthakumar Thiagarajan break; 5334a925a376SVasanthakumar Thiagarajan } 5335a925a376SVasanthakumar Thiagarajan } 5336a925a376SVasanthakumar Thiagarajan } 5337a925a376SVasanthakumar Thiagarajan if (!found) 5338a925a376SVasanthakumar Thiagarajan return false; 5339a925a376SVasanthakumar Thiagarajan } 5340a925a376SVasanthakumar Thiagarajan 5341a925a376SVasanthakumar Thiagarajan return true; 5342a925a376SVasanthakumar Thiagarajan } 5343a925a376SVasanthakumar Thiagarajan 5344d7579d12SMichal Kazior static int 5345d7579d12SMichal Kazior ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 53465c01aa3dSMichal Kazior struct wmi_svc_rdy_ev_arg *arg) 53475c01aa3dSMichal Kazior { 53485c01aa3dSMichal Kazior struct wmi_service_ready_event *ev; 53495c01aa3dSMichal Kazior size_t i, n; 53505c01aa3dSMichal Kazior 53515c01aa3dSMichal Kazior if (skb->len < sizeof(*ev)) 53525c01aa3dSMichal Kazior return -EPROTO; 53535c01aa3dSMichal Kazior 53545c01aa3dSMichal Kazior ev = (void *)skb->data; 53555c01aa3dSMichal Kazior skb_pull(skb, sizeof(*ev)); 53565c01aa3dSMichal Kazior arg->min_tx_power = ev->hw_min_tx_power; 53575c01aa3dSMichal Kazior arg->max_tx_power = ev->hw_max_tx_power; 53585c01aa3dSMichal Kazior arg->ht_cap = ev->ht_cap_info; 53595c01aa3dSMichal Kazior arg->vht_cap = ev->vht_cap_info; 536073690c48STomislav Požega arg->vht_supp_mcs = ev->vht_supp_mcs; 53615c01aa3dSMichal Kazior arg->sw_ver0 = ev->sw_version; 53625c01aa3dSMichal Kazior arg->sw_ver1 = ev->sw_version_1; 53635c01aa3dSMichal Kazior arg->phy_capab = ev->phy_capability; 53645c01aa3dSMichal Kazior arg->num_rf_chains = ev->num_rf_chains; 53655c01aa3dSMichal Kazior arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd; 5366fa879490STomislav Požega arg->low_2ghz_chan = ev->hal_reg_capabilities.low_2ghz_chan; 5367fa879490STomislav Požega arg->high_2ghz_chan = ev->hal_reg_capabilities.high_2ghz_chan; 5368523f6701STamizh chelvam arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan; 5369523f6701STamizh chelvam arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan; 53705c01aa3dSMichal Kazior arg->num_mem_reqs = ev->num_mem_reqs; 53715c01aa3dSMichal Kazior arg->service_map = ev->wmi_service_bitmap; 53722a3e60d3SMichal Kazior arg->service_map_len = sizeof(ev->wmi_service_bitmap); 53735c01aa3dSMichal Kazior 53745c01aa3dSMichal Kazior n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs), 53755c01aa3dSMichal Kazior ARRAY_SIZE(arg->mem_reqs)); 53765c01aa3dSMichal Kazior for (i = 0; i < n; i++) 53775c01aa3dSMichal Kazior arg->mem_reqs[i] = &ev->mem_reqs[i]; 53785c01aa3dSMichal Kazior 53795c01aa3dSMichal Kazior if (skb->len < 53805c01aa3dSMichal Kazior __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0])) 53815c01aa3dSMichal Kazior return -EPROTO; 53825c01aa3dSMichal Kazior 53835c01aa3dSMichal Kazior return 0; 53845c01aa3dSMichal Kazior } 53855c01aa3dSMichal Kazior 5386d7579d12SMichal Kazior static int 5387d7579d12SMichal Kazior ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 53885c01aa3dSMichal Kazior struct wmi_svc_rdy_ev_arg *arg) 53895c01aa3dSMichal Kazior { 53905c01aa3dSMichal Kazior struct wmi_10x_service_ready_event *ev; 53915c01aa3dSMichal Kazior int i, n; 53925c01aa3dSMichal Kazior 53935c01aa3dSMichal Kazior if (skb->len < sizeof(*ev)) 53945c01aa3dSMichal Kazior return -EPROTO; 53955c01aa3dSMichal Kazior 53965c01aa3dSMichal Kazior ev = (void *)skb->data; 53975c01aa3dSMichal Kazior skb_pull(skb, sizeof(*ev)); 53985c01aa3dSMichal Kazior arg->min_tx_power = ev->hw_min_tx_power; 53995c01aa3dSMichal Kazior arg->max_tx_power = ev->hw_max_tx_power; 54005c01aa3dSMichal Kazior arg->ht_cap = ev->ht_cap_info; 54015c01aa3dSMichal Kazior arg->vht_cap = ev->vht_cap_info; 540273690c48STomislav Požega arg->vht_supp_mcs = ev->vht_supp_mcs; 54035c01aa3dSMichal Kazior arg->sw_ver0 = ev->sw_version; 54045c01aa3dSMichal Kazior arg->phy_capab = ev->phy_capability; 54055c01aa3dSMichal Kazior arg->num_rf_chains = ev->num_rf_chains; 54065c01aa3dSMichal Kazior arg->eeprom_rd = ev->hal_reg_capabilities.eeprom_rd; 5407fa879490STomislav Požega arg->low_2ghz_chan = ev->hal_reg_capabilities.low_2ghz_chan; 5408fa879490STomislav Požega arg->high_2ghz_chan = ev->hal_reg_capabilities.high_2ghz_chan; 5409523f6701STamizh chelvam arg->low_5ghz_chan = ev->hal_reg_capabilities.low_5ghz_chan; 5410523f6701STamizh chelvam arg->high_5ghz_chan = ev->hal_reg_capabilities.high_5ghz_chan; 54115c01aa3dSMichal Kazior arg->num_mem_reqs = ev->num_mem_reqs; 54125c01aa3dSMichal Kazior arg->service_map = ev->wmi_service_bitmap; 54132a3e60d3SMichal Kazior arg->service_map_len = sizeof(ev->wmi_service_bitmap); 54145c01aa3dSMichal Kazior 54151382993fSWen Gong /* Deliberately skipping ev->sys_cap_info as WMI and WMI-TLV have 54161382993fSWen Gong * different values. We would need a translation to handle that, 54171382993fSWen Gong * but as we don't currently need anything from sys_cap_info from 54181382993fSWen Gong * WMI interface (only from WMI-TLV) safest it to skip it. 54191382993fSWen Gong */ 54201382993fSWen Gong 54215c01aa3dSMichal Kazior n = min_t(size_t, __le32_to_cpu(arg->num_mem_reqs), 54225c01aa3dSMichal Kazior ARRAY_SIZE(arg->mem_reqs)); 54235c01aa3dSMichal Kazior for (i = 0; i < n; i++) 54245c01aa3dSMichal Kazior arg->mem_reqs[i] = &ev->mem_reqs[i]; 54255c01aa3dSMichal Kazior 54265c01aa3dSMichal Kazior if (skb->len < 54275c01aa3dSMichal Kazior __le32_to_cpu(arg->num_mem_reqs) * sizeof(arg->mem_reqs[0])) 54285c01aa3dSMichal Kazior return -EPROTO; 54295c01aa3dSMichal Kazior 54305c01aa3dSMichal Kazior return 0; 54315c01aa3dSMichal Kazior } 54325c01aa3dSMichal Kazior 5433c8ecfc1cSRaja Mani static void ath10k_wmi_event_service_ready_work(struct work_struct *work) 54345e3dd157SKalle Valo { 5435c8ecfc1cSRaja Mani struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work); 5436c8ecfc1cSRaja Mani struct sk_buff *skb = ar->svc_rdy_skb; 54375c01aa3dSMichal Kazior struct wmi_svc_rdy_ev_arg arg = {}; 54385c01aa3dSMichal Kazior u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i; 54395c01aa3dSMichal Kazior int ret; 5440a925a376SVasanthakumar Thiagarajan bool allocated; 54415e3dd157SKalle Valo 5442c8ecfc1cSRaja Mani if (!skb) { 5443c8ecfc1cSRaja Mani ath10k_warn(ar, "invalid service ready event skb\n"); 5444c8ecfc1cSRaja Mani return; 5445c8ecfc1cSRaja Mani } 5446c8ecfc1cSRaja Mani 5447d7579d12SMichal Kazior ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg); 54485c01aa3dSMichal Kazior if (ret) { 54495c01aa3dSMichal Kazior ath10k_warn(ar, "failed to parse service ready: %d\n", ret); 54505e3dd157SKalle Valo return; 54515e3dd157SKalle Valo } 54525e3dd157SKalle Valo 5453d7579d12SMichal Kazior ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map, 5454d7579d12SMichal Kazior arg.service_map_len); 5455d7579d12SMichal Kazior 54565c01aa3dSMichal Kazior ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power); 54575c01aa3dSMichal Kazior ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power); 54585c01aa3dSMichal Kazior ar->ht_cap_info = __le32_to_cpu(arg.ht_cap); 54595c01aa3dSMichal Kazior ar->vht_cap_info = __le32_to_cpu(arg.vht_cap); 546073690c48STomislav Požega ar->vht_supp_mcs = __le32_to_cpu(arg.vht_supp_mcs); 54615e3dd157SKalle Valo ar->fw_version_major = 54625c01aa3dSMichal Kazior (__le32_to_cpu(arg.sw_ver0) & 0xff000000) >> 24; 54635c01aa3dSMichal Kazior ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff); 54645e3dd157SKalle Valo ar->fw_version_release = 54655c01aa3dSMichal Kazior (__le32_to_cpu(arg.sw_ver1) & 0xffff0000) >> 16; 54665c01aa3dSMichal Kazior ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff); 54675c01aa3dSMichal Kazior ar->phy_capability = __le32_to_cpu(arg.phy_capab); 54685c01aa3dSMichal Kazior ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains); 5469209b2a68SBartosz Markowski ar->hw_eeprom_rd = __le32_to_cpu(arg.eeprom_rd); 5470fa879490STomislav Požega ar->low_2ghz_chan = __le32_to_cpu(arg.low_2ghz_chan); 5471fa879490STomislav Požega ar->high_2ghz_chan = __le32_to_cpu(arg.high_2ghz_chan); 5472523f6701STamizh chelvam ar->low_5ghz_chan = __le32_to_cpu(arg.low_5ghz_chan); 5473523f6701STamizh chelvam ar->high_5ghz_chan = __le32_to_cpu(arg.high_5ghz_chan); 54741382993fSWen Gong ar->sys_cap_info = __le32_to_cpu(arg.sys_cap_info); 54755c01aa3dSMichal Kazior 54765c01aa3dSMichal Kazior ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ", 54772a3e60d3SMichal Kazior arg.service_map, arg.service_map_len); 54781382993fSWen Gong ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi sys_cap_info 0x%x\n", 54791382993fSWen Gong ar->sys_cap_info); 54808865bee4SMichal Kazior 54815c8726ecSRaja Mani if (ar->num_rf_chains > ar->max_spatial_stream) { 54827aa7a72aSMichal Kazior ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n", 54835c8726ecSRaja Mani ar->num_rf_chains, ar->max_spatial_stream); 54845c8726ecSRaja Mani ar->num_rf_chains = ar->max_spatial_stream; 54858865bee4SMichal Kazior } 54865e3dd157SKalle Valo 5487166de3f1SRajkumar Manoharan if (!ar->cfg_tx_chainmask) { 5488166de3f1SRajkumar Manoharan ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1; 5489166de3f1SRajkumar Manoharan ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1; 5490166de3f1SRajkumar Manoharan } 5491fdb959c7SMichal Kazior 54925e3dd157SKalle Valo if (strlen(ar->hw->wiphy->fw_version) == 0) { 54935e3dd157SKalle Valo snprintf(ar->hw->wiphy->fw_version, 54945e3dd157SKalle Valo sizeof(ar->hw->wiphy->fw_version), 54955e3dd157SKalle Valo "%u.%u.%u.%u", 54965e3dd157SKalle Valo ar->fw_version_major, 54975e3dd157SKalle Valo ar->fw_version_minor, 54985e3dd157SKalle Valo ar->fw_version_release, 54995e3dd157SKalle Valo ar->fw_version_build); 55005e3dd157SKalle Valo } 55015e3dd157SKalle Valo 55025c01aa3dSMichal Kazior num_mem_reqs = __le32_to_cpu(arg.num_mem_reqs); 55035c01aa3dSMichal Kazior if (num_mem_reqs > WMI_MAX_MEM_REQS) { 55047aa7a72aSMichal Kazior ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n", 5505b3effe61SBartosz Markowski num_mem_reqs); 5506b3effe61SBartosz Markowski return; 55076f97d256SBartosz Markowski } 55086f97d256SBartosz Markowski 5509b0399417SRaja Mani if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) { 551099ad1cbaSMichal Kazior if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL, 5511c4cdf753SKalle Valo ar->running_fw->fw_file.fw_features)) 551299ad1cbaSMichal Kazior ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC + 55135699a6f2SRaja Mani ar->max_num_vdevs; 551499ad1cbaSMichal Kazior else 551599ad1cbaSMichal Kazior ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS + 551699ad1cbaSMichal Kazior ar->max_num_vdevs; 551799ad1cbaSMichal Kazior 551899ad1cbaSMichal Kazior ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX + 55195699a6f2SRaja Mani ar->max_num_vdevs; 5520b0399417SRaja Mani ar->num_tids = ar->num_active_peers * 2; 5521b0399417SRaja Mani ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX; 5522b0399417SRaja Mani } 5523b0399417SRaja Mani 5524b0399417SRaja Mani /* TODO: Adjust max peer count for cases like WMI_SERVICE_RATECTRL_CACHE 5525b0399417SRaja Mani * and WMI_SERVICE_IRAM_TIDS, etc. 5526b0399417SRaja Mani */ 5527b0399417SRaja Mani 5528a925a376SVasanthakumar Thiagarajan allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs, 5529a925a376SVasanthakumar Thiagarajan num_mem_reqs); 5530a925a376SVasanthakumar Thiagarajan if (allocated) 5531a925a376SVasanthakumar Thiagarajan goto skip_mem_alloc; 5532a925a376SVasanthakumar Thiagarajan 5533a925a376SVasanthakumar Thiagarajan /* Either this event is received during boot time or there is a change 5534a925a376SVasanthakumar Thiagarajan * in memory requirement from firmware when compared to last request. 5535a925a376SVasanthakumar Thiagarajan * Free any old memory and do a fresh allocation based on the current 5536a925a376SVasanthakumar Thiagarajan * memory requirement. 5537a925a376SVasanthakumar Thiagarajan */ 5538a925a376SVasanthakumar Thiagarajan ath10k_wmi_free_host_mem(ar); 5539a925a376SVasanthakumar Thiagarajan 5540b3effe61SBartosz Markowski for (i = 0; i < num_mem_reqs; ++i) { 55415c01aa3dSMichal Kazior req_id = __le32_to_cpu(arg.mem_reqs[i]->req_id); 55425c01aa3dSMichal Kazior num_units = __le32_to_cpu(arg.mem_reqs[i]->num_units); 55435c01aa3dSMichal Kazior unit_size = __le32_to_cpu(arg.mem_reqs[i]->unit_size); 55445c01aa3dSMichal Kazior num_unit_info = __le32_to_cpu(arg.mem_reqs[i]->num_unit_info); 5545b3effe61SBartosz Markowski 5546b0399417SRaja Mani if (num_unit_info & NUM_UNITS_IS_NUM_ACTIVE_PEERS) { 5547b0399417SRaja Mani if (ar->num_active_peers) 5548b0399417SRaja Mani num_units = ar->num_active_peers + 1; 5549b0399417SRaja Mani else 5550b0399417SRaja Mani num_units = ar->max_num_peers + 1; 5551b0399417SRaja Mani } else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) { 5552b3effe61SBartosz Markowski /* number of units to allocate is number of 5553d6dfe25cSMarcin Rokicki * peers, 1 extra for self peer on target 5554d6dfe25cSMarcin Rokicki * this needs to be tied, host and target 5555d6dfe25cSMarcin Rokicki * can get out of sync 5556d6dfe25cSMarcin Rokicki */ 5557b0399417SRaja Mani num_units = ar->max_num_peers + 1; 5558b0399417SRaja Mani } else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) { 5559b0399417SRaja Mani num_units = ar->max_num_vdevs + 1; 5560b0399417SRaja Mani } 5561b3effe61SBartosz Markowski 55627aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 5563b3effe61SBartosz Markowski "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n", 5564b3effe61SBartosz Markowski req_id, 55655c01aa3dSMichal Kazior __le32_to_cpu(arg.mem_reqs[i]->num_units), 5566b3effe61SBartosz Markowski num_unit_info, 5567b3effe61SBartosz Markowski unit_size, 5568b3effe61SBartosz Markowski num_units); 5569b3effe61SBartosz Markowski 5570b3effe61SBartosz Markowski ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units, 5571b3effe61SBartosz Markowski unit_size); 5572b3effe61SBartosz Markowski if (ret) 5573b3effe61SBartosz Markowski return; 5574b3effe61SBartosz Markowski } 5575b3effe61SBartosz Markowski 5576a925a376SVasanthakumar Thiagarajan skip_mem_alloc: 55777aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 557873690c48STomislav Požega "wmi event service ready min_tx_power 0x%08x max_tx_power 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_mcs 0x%08x sw_ver0 0x%08x sw_ver1 0x%08x fw_build 0x%08x phy_capab 0x%08x num_rf_chains 0x%08x eeprom_rd 0x%08x low_2ghz_chan %d high_2ghz_chan %d low_5ghz_chan %d high_5ghz_chan %d num_mem_reqs 0x%08x\n", 55795c01aa3dSMichal Kazior __le32_to_cpu(arg.min_tx_power), 55805c01aa3dSMichal Kazior __le32_to_cpu(arg.max_tx_power), 55815c01aa3dSMichal Kazior __le32_to_cpu(arg.ht_cap), 55825c01aa3dSMichal Kazior __le32_to_cpu(arg.vht_cap), 558373690c48STomislav Požega __le32_to_cpu(arg.vht_supp_mcs), 55845c01aa3dSMichal Kazior __le32_to_cpu(arg.sw_ver0), 55855c01aa3dSMichal Kazior __le32_to_cpu(arg.sw_ver1), 5586ca996ec5SMichal Kazior __le32_to_cpu(arg.fw_build), 55875c01aa3dSMichal Kazior __le32_to_cpu(arg.phy_capab), 55885c01aa3dSMichal Kazior __le32_to_cpu(arg.num_rf_chains), 55895c01aa3dSMichal Kazior __le32_to_cpu(arg.eeprom_rd), 5590275ea1b2STomislav Požega __le32_to_cpu(arg.low_2ghz_chan), 5591275ea1b2STomislav Požega __le32_to_cpu(arg.high_2ghz_chan), 5592275ea1b2STomislav Požega __le32_to_cpu(arg.low_5ghz_chan), 5593275ea1b2STomislav Požega __le32_to_cpu(arg.high_5ghz_chan), 55945c01aa3dSMichal Kazior __le32_to_cpu(arg.num_mem_reqs)); 55956f97d256SBartosz Markowski 5596c8ecfc1cSRaja Mani dev_kfree_skb(skb); 5597c8ecfc1cSRaja Mani ar->svc_rdy_skb = NULL; 55986f97d256SBartosz Markowski complete(&ar->wmi.service_ready); 55996f97d256SBartosz Markowski } 56006f97d256SBartosz Markowski 5601c8ecfc1cSRaja Mani void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb) 5602c8ecfc1cSRaja Mani { 5603c8ecfc1cSRaja Mani ar->svc_rdy_skb = skb; 5604c8ecfc1cSRaja Mani queue_work(ar->workqueue_aux, &ar->svc_rdy_work); 5605c8ecfc1cSRaja Mani } 5606c8ecfc1cSRaja Mani 5607d7579d12SMichal Kazior static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb, 560832653cf1SMichal Kazior struct wmi_rdy_ev_arg *arg) 560932653cf1SMichal Kazior { 561032653cf1SMichal Kazior struct wmi_ready_event *ev = (void *)skb->data; 561132653cf1SMichal Kazior 561232653cf1SMichal Kazior if (skb->len < sizeof(*ev)) 561332653cf1SMichal Kazior return -EPROTO; 561432653cf1SMichal Kazior 561532653cf1SMichal Kazior skb_pull(skb, sizeof(*ev)); 561632653cf1SMichal Kazior arg->sw_version = ev->sw_version; 561732653cf1SMichal Kazior arg->abi_version = ev->abi_version; 561832653cf1SMichal Kazior arg->status = ev->status; 561932653cf1SMichal Kazior arg->mac_addr = ev->mac_addr.addr; 562032653cf1SMichal Kazior 562132653cf1SMichal Kazior return 0; 562232653cf1SMichal Kazior } 562332653cf1SMichal Kazior 5624c1a4654aSMichal Kazior static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb, 5625c1a4654aSMichal Kazior struct wmi_roam_ev_arg *arg) 5626c1a4654aSMichal Kazior { 5627c1a4654aSMichal Kazior struct wmi_roam_ev *ev = (void *)skb->data; 5628c1a4654aSMichal Kazior 5629c1a4654aSMichal Kazior if (skb->len < sizeof(*ev)) 5630c1a4654aSMichal Kazior return -EPROTO; 5631c1a4654aSMichal Kazior 5632c1a4654aSMichal Kazior skb_pull(skb, sizeof(*ev)); 5633c1a4654aSMichal Kazior arg->vdev_id = ev->vdev_id; 5634c1a4654aSMichal Kazior arg->reason = ev->reason; 5635c1a4654aSMichal Kazior 5636c1a4654aSMichal Kazior return 0; 5637c1a4654aSMichal Kazior } 5638c1a4654aSMichal Kazior 563984d4911bSMichal Kazior static int ath10k_wmi_op_pull_echo_ev(struct ath10k *ar, 564084d4911bSMichal Kazior struct sk_buff *skb, 564184d4911bSMichal Kazior struct wmi_echo_ev_arg *arg) 564284d4911bSMichal Kazior { 564384d4911bSMichal Kazior struct wmi_echo_event *ev = (void *)skb->data; 564484d4911bSMichal Kazior 564584d4911bSMichal Kazior arg->value = ev->value; 564684d4911bSMichal Kazior 564784d4911bSMichal Kazior return 0; 564884d4911bSMichal Kazior } 564984d4911bSMichal Kazior 56500226d602SMichal Kazior int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb) 56515e3dd157SKalle Valo { 565232653cf1SMichal Kazior struct wmi_rdy_ev_arg arg = {}; 565332653cf1SMichal Kazior int ret; 56545e3dd157SKalle Valo 5655d7579d12SMichal Kazior ret = ath10k_wmi_pull_rdy(ar, skb, &arg); 565632653cf1SMichal Kazior if (ret) { 565732653cf1SMichal Kazior ath10k_warn(ar, "failed to parse ready event: %d\n", ret); 565832653cf1SMichal Kazior return ret; 565932653cf1SMichal Kazior } 56605e3dd157SKalle Valo 56617aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 56627b308732STomislav Požega "wmi event ready sw_version 0x%08x abi_version %u mac_addr %pM status %d\n", 566332653cf1SMichal Kazior __le32_to_cpu(arg.sw_version), 566432653cf1SMichal Kazior __le32_to_cpu(arg.abi_version), 566532653cf1SMichal Kazior arg.mac_addr, 566632653cf1SMichal Kazior __le32_to_cpu(arg.status)); 56675e3dd157SKalle Valo 56689d580466SBrian Norris if (is_zero_ether_addr(ar->mac_addr)) 566932653cf1SMichal Kazior ether_addr_copy(ar->mac_addr, arg.mac_addr); 56705e3dd157SKalle Valo complete(&ar->wmi.unified_ready); 56715e3dd157SKalle Valo return 0; 56725e3dd157SKalle Valo } 56735e3dd157SKalle Valo 5674cea19a6cSCarl Huang void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb) 5675cea19a6cSCarl Huang { 5676cea19a6cSCarl Huang int ret; 5677cea19a6cSCarl Huang struct wmi_svc_avail_ev_arg arg = {}; 5678cea19a6cSCarl Huang 5679cea19a6cSCarl Huang ret = ath10k_wmi_pull_svc_avail(ar, skb, &arg); 5680cea19a6cSCarl Huang if (ret) { 568178528134SColin Ian King ath10k_warn(ar, "failed to parse service available event: %d\n", 5682cea19a6cSCarl Huang ret); 5683cea19a6cSCarl Huang } 5684cea19a6cSCarl Huang 5685cea19a6cSCarl Huang ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map, 5686cea19a6cSCarl Huang __le32_to_cpu(arg.service_map_ext_len)); 5687cea19a6cSCarl Huang } 5688cea19a6cSCarl Huang 5689a57a6a27SRajkumar Manoharan static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb) 5690a57a6a27SRajkumar Manoharan { 5691a57a6a27SRajkumar Manoharan const struct wmi_pdev_temperature_event *ev; 5692a57a6a27SRajkumar Manoharan 5693a57a6a27SRajkumar Manoharan ev = (struct wmi_pdev_temperature_event *)skb->data; 5694a57a6a27SRajkumar Manoharan if (WARN_ON(skb->len < sizeof(*ev))) 5695a57a6a27SRajkumar Manoharan return -EPROTO; 5696a57a6a27SRajkumar Manoharan 5697ac2953fcSRajkumar Manoharan ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature)); 5698a57a6a27SRajkumar Manoharan return 0; 5699a57a6a27SRajkumar Manoharan } 5700a57a6a27SRajkumar Manoharan 570189d2d183SRajkumar Manoharan static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k *ar, 570289d2d183SRajkumar Manoharan struct sk_buff *skb) 570389d2d183SRajkumar Manoharan { 570489d2d183SRajkumar Manoharan struct wmi_pdev_bss_chan_info_event *ev; 5705fa7937e3SRajkumar Manoharan struct survey_info *survey; 570689d2d183SRajkumar Manoharan u64 busy, total, tx, rx, rx_bss; 570789d2d183SRajkumar Manoharan u32 freq, noise_floor; 5708fa7937e3SRajkumar Manoharan u32 cc_freq_hz = ar->hw_params.channel_counters_freq_hz; 5709fa7937e3SRajkumar Manoharan int idx; 571089d2d183SRajkumar Manoharan 571189d2d183SRajkumar Manoharan ev = (struct wmi_pdev_bss_chan_info_event *)skb->data; 571289d2d183SRajkumar Manoharan if (WARN_ON(skb->len < sizeof(*ev))) 571389d2d183SRajkumar Manoharan return -EPROTO; 571489d2d183SRajkumar Manoharan 571589d2d183SRajkumar Manoharan freq = __le32_to_cpu(ev->freq); 571689d2d183SRajkumar Manoharan noise_floor = __le32_to_cpu(ev->noise_floor); 571789d2d183SRajkumar Manoharan busy = __le64_to_cpu(ev->cycle_busy); 571889d2d183SRajkumar Manoharan total = __le64_to_cpu(ev->cycle_total); 571989d2d183SRajkumar Manoharan tx = __le64_to_cpu(ev->cycle_tx); 572089d2d183SRajkumar Manoharan rx = __le64_to_cpu(ev->cycle_rx); 572189d2d183SRajkumar Manoharan rx_bss = __le64_to_cpu(ev->cycle_rx_bss); 572289d2d183SRajkumar Manoharan 572389d2d183SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 572489d2d183SRajkumar Manoharan "wmi event pdev bss chan info:\n freq: %d noise: %d cycle: busy %llu total %llu tx %llu rx %llu rx_bss %llu\n", 572589d2d183SRajkumar Manoharan freq, noise_floor, busy, total, tx, rx, rx_bss); 572689d2d183SRajkumar Manoharan 5727fa7937e3SRajkumar Manoharan spin_lock_bh(&ar->data_lock); 5728fa7937e3SRajkumar Manoharan idx = freq_to_idx(ar, freq); 5729fa7937e3SRajkumar Manoharan if (idx >= ARRAY_SIZE(ar->survey)) { 5730fa7937e3SRajkumar Manoharan ath10k_warn(ar, "bss chan info: invalid frequency %d (idx %d out of bounds)\n", 5731fa7937e3SRajkumar Manoharan freq, idx); 5732fa7937e3SRajkumar Manoharan goto exit; 5733fa7937e3SRajkumar Manoharan } 5734fa7937e3SRajkumar Manoharan 5735fa7937e3SRajkumar Manoharan survey = &ar->survey[idx]; 5736fa7937e3SRajkumar Manoharan 5737fa7937e3SRajkumar Manoharan survey->noise = noise_floor; 5738fa7937e3SRajkumar Manoharan survey->time = div_u64(total, cc_freq_hz); 5739fa7937e3SRajkumar Manoharan survey->time_busy = div_u64(busy, cc_freq_hz); 5740fa7937e3SRajkumar Manoharan survey->time_rx = div_u64(rx_bss, cc_freq_hz); 5741fa7937e3SRajkumar Manoharan survey->time_tx = div_u64(tx, cc_freq_hz); 5742fa7937e3SRajkumar Manoharan survey->filled |= (SURVEY_INFO_NOISE_DBM | 5743fa7937e3SRajkumar Manoharan SURVEY_INFO_TIME | 5744fa7937e3SRajkumar Manoharan SURVEY_INFO_TIME_BUSY | 5745fa7937e3SRajkumar Manoharan SURVEY_INFO_TIME_RX | 5746fa7937e3SRajkumar Manoharan SURVEY_INFO_TIME_TX); 5747fa7937e3SRajkumar Manoharan exit: 5748fa7937e3SRajkumar Manoharan spin_unlock_bh(&ar->data_lock); 5749fa7937e3SRajkumar Manoharan complete(&ar->bss_survey_done); 575089d2d183SRajkumar Manoharan return 0; 575189d2d183SRajkumar Manoharan } 575289d2d183SRajkumar Manoharan 5753ebee76f7SBenjamin Berg static inline void ath10k_wmi_queue_set_coverage_class_work(struct ath10k *ar) 5754ebee76f7SBenjamin Berg { 5755ebee76f7SBenjamin Berg if (ar->hw_params.hw_ops->set_coverage_class) { 5756ebee76f7SBenjamin Berg spin_lock_bh(&ar->data_lock); 5757ebee76f7SBenjamin Berg 5758ebee76f7SBenjamin Berg /* This call only ensures that the modified coverage class 5759ebee76f7SBenjamin Berg * persists in case the firmware sets the registers back to 5760ebee76f7SBenjamin Berg * their default value. So calling it is only necessary if the 5761ebee76f7SBenjamin Berg * coverage class has a non-zero value. 5762ebee76f7SBenjamin Berg */ 5763ebee76f7SBenjamin Berg if (ar->fw_coverage.coverage_class) 5764ebee76f7SBenjamin Berg queue_work(ar->workqueue, &ar->set_coverage_class_work); 5765ebee76f7SBenjamin Berg 5766ebee76f7SBenjamin Berg spin_unlock_bh(&ar->data_lock); 5767ebee76f7SBenjamin Berg } 5768ebee76f7SBenjamin Berg } 5769ebee76f7SBenjamin Berg 5770d7579d12SMichal Kazior static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb) 57715e3dd157SKalle Valo { 57725e3dd157SKalle Valo struct wmi_cmd_hdr *cmd_hdr; 57735e3dd157SKalle Valo enum wmi_event_id id; 57745e3dd157SKalle Valo 57755e3dd157SKalle Valo cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 57765e3dd157SKalle Valo id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 57775e3dd157SKalle Valo 57785e3dd157SKalle Valo if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 5779469d479fSMichal Kazior goto out; 57805e3dd157SKalle Valo 5781d35a6c18SMichal Kazior trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 57825e3dd157SKalle Valo 57835e3dd157SKalle Valo switch (id) { 57845e3dd157SKalle Valo case WMI_MGMT_RX_EVENTID: 57855e3dd157SKalle Valo ath10k_wmi_event_mgmt_rx(ar, skb); 57865e3dd157SKalle Valo /* mgmt_rx() owns the skb now! */ 57875e3dd157SKalle Valo return; 57885e3dd157SKalle Valo case WMI_SCAN_EVENTID: 57895e3dd157SKalle Valo ath10k_wmi_event_scan(ar, skb); 5790ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 57915e3dd157SKalle Valo break; 57925e3dd157SKalle Valo case WMI_CHAN_INFO_EVENTID: 57935e3dd157SKalle Valo ath10k_wmi_event_chan_info(ar, skb); 57945e3dd157SKalle Valo break; 57955e3dd157SKalle Valo case WMI_ECHO_EVENTID: 57965e3dd157SKalle Valo ath10k_wmi_event_echo(ar, skb); 57975e3dd157SKalle Valo break; 57985e3dd157SKalle Valo case WMI_DEBUG_MESG_EVENTID: 57995e3dd157SKalle Valo ath10k_wmi_event_debug_mesg(ar, skb); 5800ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 58015e3dd157SKalle Valo break; 58025e3dd157SKalle Valo case WMI_UPDATE_STATS_EVENTID: 58035e3dd157SKalle Valo ath10k_wmi_event_update_stats(ar, skb); 58045e3dd157SKalle Valo break; 58055e3dd157SKalle Valo case WMI_VDEV_START_RESP_EVENTID: 58065e3dd157SKalle Valo ath10k_wmi_event_vdev_start_resp(ar, skb); 5807ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 58085e3dd157SKalle Valo break; 58095e3dd157SKalle Valo case WMI_VDEV_STOPPED_EVENTID: 58105e3dd157SKalle Valo ath10k_wmi_event_vdev_stopped(ar, skb); 5811ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 58125e3dd157SKalle Valo break; 58135e3dd157SKalle Valo case WMI_PEER_STA_KICKOUT_EVENTID: 58145e3dd157SKalle Valo ath10k_wmi_event_peer_sta_kickout(ar, skb); 58155e3dd157SKalle Valo break; 58165e3dd157SKalle Valo case WMI_HOST_SWBA_EVENTID: 58175e3dd157SKalle Valo ath10k_wmi_event_host_swba(ar, skb); 58185e3dd157SKalle Valo break; 58195e3dd157SKalle Valo case WMI_TBTTOFFSET_UPDATE_EVENTID: 58205e3dd157SKalle Valo ath10k_wmi_event_tbttoffset_update(ar, skb); 58215e3dd157SKalle Valo break; 58225e3dd157SKalle Valo case WMI_PHYERR_EVENTID: 58235e3dd157SKalle Valo ath10k_wmi_event_phyerr(ar, skb); 58245e3dd157SKalle Valo break; 58255e3dd157SKalle Valo case WMI_ROAM_EVENTID: 58265e3dd157SKalle Valo ath10k_wmi_event_roam(ar, skb); 5827ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 58285e3dd157SKalle Valo break; 58295e3dd157SKalle Valo case WMI_PROFILE_MATCH: 58305e3dd157SKalle Valo ath10k_wmi_event_profile_match(ar, skb); 58315e3dd157SKalle Valo break; 58325e3dd157SKalle Valo case WMI_DEBUG_PRINT_EVENTID: 58335e3dd157SKalle Valo ath10k_wmi_event_debug_print(ar, skb); 5834ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 58355e3dd157SKalle Valo break; 58365e3dd157SKalle Valo case WMI_PDEV_QVIT_EVENTID: 58375e3dd157SKalle Valo ath10k_wmi_event_pdev_qvit(ar, skb); 58385e3dd157SKalle Valo break; 58395e3dd157SKalle Valo case WMI_WLAN_PROFILE_DATA_EVENTID: 58405e3dd157SKalle Valo ath10k_wmi_event_wlan_profile_data(ar, skb); 58415e3dd157SKalle Valo break; 58425e3dd157SKalle Valo case WMI_RTT_MEASUREMENT_REPORT_EVENTID: 58435e3dd157SKalle Valo ath10k_wmi_event_rtt_measurement_report(ar, skb); 58445e3dd157SKalle Valo break; 58455e3dd157SKalle Valo case WMI_TSF_MEASUREMENT_REPORT_EVENTID: 58465e3dd157SKalle Valo ath10k_wmi_event_tsf_measurement_report(ar, skb); 58475e3dd157SKalle Valo break; 58485e3dd157SKalle Valo case WMI_RTT_ERROR_REPORT_EVENTID: 58495e3dd157SKalle Valo ath10k_wmi_event_rtt_error_report(ar, skb); 58505e3dd157SKalle Valo break; 58515e3dd157SKalle Valo case WMI_WOW_WAKEUP_HOST_EVENTID: 58525e3dd157SKalle Valo ath10k_wmi_event_wow_wakeup_host(ar, skb); 58535e3dd157SKalle Valo break; 58545e3dd157SKalle Valo case WMI_DCS_INTERFERENCE_EVENTID: 58555e3dd157SKalle Valo ath10k_wmi_event_dcs_interference(ar, skb); 58565e3dd157SKalle Valo break; 58575e3dd157SKalle Valo case WMI_PDEV_TPC_CONFIG_EVENTID: 58585e3dd157SKalle Valo ath10k_wmi_event_pdev_tpc_config(ar, skb); 58595e3dd157SKalle Valo break; 58605e3dd157SKalle Valo case WMI_PDEV_FTM_INTG_EVENTID: 58615e3dd157SKalle Valo ath10k_wmi_event_pdev_ftm_intg(ar, skb); 58625e3dd157SKalle Valo break; 58635e3dd157SKalle Valo case WMI_GTK_OFFLOAD_STATUS_EVENTID: 58645e3dd157SKalle Valo ath10k_wmi_event_gtk_offload_status(ar, skb); 58655e3dd157SKalle Valo break; 58665e3dd157SKalle Valo case WMI_GTK_REKEY_FAIL_EVENTID: 58675e3dd157SKalle Valo ath10k_wmi_event_gtk_rekey_fail(ar, skb); 58685e3dd157SKalle Valo break; 58695e3dd157SKalle Valo case WMI_TX_DELBA_COMPLETE_EVENTID: 58705e3dd157SKalle Valo ath10k_wmi_event_delba_complete(ar, skb); 58715e3dd157SKalle Valo break; 58725e3dd157SKalle Valo case WMI_TX_ADDBA_COMPLETE_EVENTID: 58735e3dd157SKalle Valo ath10k_wmi_event_addba_complete(ar, skb); 58745e3dd157SKalle Valo break; 58755e3dd157SKalle Valo case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID: 58765e3dd157SKalle Valo ath10k_wmi_event_vdev_install_key_complete(ar, skb); 58775e3dd157SKalle Valo break; 58785e3dd157SKalle Valo case WMI_SERVICE_READY_EVENTID: 5879b34d2b3dSMichal Kazior ath10k_wmi_event_service_ready(ar, skb); 5880c8ecfc1cSRaja Mani return; 58815e3dd157SKalle Valo case WMI_READY_EVENTID: 5882b34d2b3dSMichal Kazior ath10k_wmi_event_ready(ar, skb); 5883ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 58845e3dd157SKalle Valo break; 5885cea19a6cSCarl Huang case WMI_SERVICE_AVAILABLE_EVENTID: 5886cea19a6cSCarl Huang ath10k_wmi_event_service_available(ar, skb); 5887cea19a6cSCarl Huang break; 58885e3dd157SKalle Valo default: 58897aa7a72aSMichal Kazior ath10k_warn(ar, "Unknown eventid: %d\n", id); 58905e3dd157SKalle Valo break; 58915e3dd157SKalle Valo } 58925e3dd157SKalle Valo 5893469d479fSMichal Kazior out: 58945e3dd157SKalle Valo dev_kfree_skb(skb); 58955e3dd157SKalle Valo } 58965e3dd157SKalle Valo 5897d7579d12SMichal Kazior static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb) 58988a6618b0SBartosz Markowski { 58998a6618b0SBartosz Markowski struct wmi_cmd_hdr *cmd_hdr; 59008a6618b0SBartosz Markowski enum wmi_10x_event_id id; 590143d2a30fSKalle Valo bool consumed; 59028a6618b0SBartosz Markowski 59038a6618b0SBartosz Markowski cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 59048a6618b0SBartosz Markowski id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 59058a6618b0SBartosz Markowski 59068a6618b0SBartosz Markowski if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 5907469d479fSMichal Kazior goto out; 59088a6618b0SBartosz Markowski 5909d35a6c18SMichal Kazior trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 59108a6618b0SBartosz Markowski 591143d2a30fSKalle Valo consumed = ath10k_tm_event_wmi(ar, id, skb); 591243d2a30fSKalle Valo 591343d2a30fSKalle Valo /* Ready event must be handled normally also in UTF mode so that we 591443d2a30fSKalle Valo * know the UTF firmware has booted, others we are just bypass WMI 591543d2a30fSKalle Valo * events to testmode. 591643d2a30fSKalle Valo */ 591743d2a30fSKalle Valo if (consumed && id != WMI_10X_READY_EVENTID) { 591843d2a30fSKalle Valo ath10k_dbg(ar, ATH10K_DBG_WMI, 591943d2a30fSKalle Valo "wmi testmode consumed 0x%x\n", id); 592043d2a30fSKalle Valo goto out; 592143d2a30fSKalle Valo } 592243d2a30fSKalle Valo 59238a6618b0SBartosz Markowski switch (id) { 59248a6618b0SBartosz Markowski case WMI_10X_MGMT_RX_EVENTID: 59258a6618b0SBartosz Markowski ath10k_wmi_event_mgmt_rx(ar, skb); 59268a6618b0SBartosz Markowski /* mgmt_rx() owns the skb now! */ 59278a6618b0SBartosz Markowski return; 59288a6618b0SBartosz Markowski case WMI_10X_SCAN_EVENTID: 59298a6618b0SBartosz Markowski ath10k_wmi_event_scan(ar, skb); 5930ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 59318a6618b0SBartosz Markowski break; 59328a6618b0SBartosz Markowski case WMI_10X_CHAN_INFO_EVENTID: 59338a6618b0SBartosz Markowski ath10k_wmi_event_chan_info(ar, skb); 59348a6618b0SBartosz Markowski break; 59358a6618b0SBartosz Markowski case WMI_10X_ECHO_EVENTID: 59368a6618b0SBartosz Markowski ath10k_wmi_event_echo(ar, skb); 59378a6618b0SBartosz Markowski break; 59388a6618b0SBartosz Markowski case WMI_10X_DEBUG_MESG_EVENTID: 59398a6618b0SBartosz Markowski ath10k_wmi_event_debug_mesg(ar, skb); 5940ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 59418a6618b0SBartosz Markowski break; 59428a6618b0SBartosz Markowski case WMI_10X_UPDATE_STATS_EVENTID: 59438a6618b0SBartosz Markowski ath10k_wmi_event_update_stats(ar, skb); 59448a6618b0SBartosz Markowski break; 59458a6618b0SBartosz Markowski case WMI_10X_VDEV_START_RESP_EVENTID: 59468a6618b0SBartosz Markowski ath10k_wmi_event_vdev_start_resp(ar, skb); 5947ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 59488a6618b0SBartosz Markowski break; 59498a6618b0SBartosz Markowski case WMI_10X_VDEV_STOPPED_EVENTID: 59508a6618b0SBartosz Markowski ath10k_wmi_event_vdev_stopped(ar, skb); 5951ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 59528a6618b0SBartosz Markowski break; 59538a6618b0SBartosz Markowski case WMI_10X_PEER_STA_KICKOUT_EVENTID: 59548a6618b0SBartosz Markowski ath10k_wmi_event_peer_sta_kickout(ar, skb); 59558a6618b0SBartosz Markowski break; 59568a6618b0SBartosz Markowski case WMI_10X_HOST_SWBA_EVENTID: 59578a6618b0SBartosz Markowski ath10k_wmi_event_host_swba(ar, skb); 59588a6618b0SBartosz Markowski break; 59598a6618b0SBartosz Markowski case WMI_10X_TBTTOFFSET_UPDATE_EVENTID: 59608a6618b0SBartosz Markowski ath10k_wmi_event_tbttoffset_update(ar, skb); 59618a6618b0SBartosz Markowski break; 59628a6618b0SBartosz Markowski case WMI_10X_PHYERR_EVENTID: 59638a6618b0SBartosz Markowski ath10k_wmi_event_phyerr(ar, skb); 59648a6618b0SBartosz Markowski break; 59658a6618b0SBartosz Markowski case WMI_10X_ROAM_EVENTID: 59668a6618b0SBartosz Markowski ath10k_wmi_event_roam(ar, skb); 5967ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 59688a6618b0SBartosz Markowski break; 59698a6618b0SBartosz Markowski case WMI_10X_PROFILE_MATCH: 59708a6618b0SBartosz Markowski ath10k_wmi_event_profile_match(ar, skb); 59718a6618b0SBartosz Markowski break; 59728a6618b0SBartosz Markowski case WMI_10X_DEBUG_PRINT_EVENTID: 59738a6618b0SBartosz Markowski ath10k_wmi_event_debug_print(ar, skb); 5974ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 59758a6618b0SBartosz Markowski break; 59768a6618b0SBartosz Markowski case WMI_10X_PDEV_QVIT_EVENTID: 59778a6618b0SBartosz Markowski ath10k_wmi_event_pdev_qvit(ar, skb); 59788a6618b0SBartosz Markowski break; 59798a6618b0SBartosz Markowski case WMI_10X_WLAN_PROFILE_DATA_EVENTID: 59808a6618b0SBartosz Markowski ath10k_wmi_event_wlan_profile_data(ar, skb); 59818a6618b0SBartosz Markowski break; 59828a6618b0SBartosz Markowski case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID: 59838a6618b0SBartosz Markowski ath10k_wmi_event_rtt_measurement_report(ar, skb); 59848a6618b0SBartosz Markowski break; 59858a6618b0SBartosz Markowski case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID: 59868a6618b0SBartosz Markowski ath10k_wmi_event_tsf_measurement_report(ar, skb); 59878a6618b0SBartosz Markowski break; 59888a6618b0SBartosz Markowski case WMI_10X_RTT_ERROR_REPORT_EVENTID: 59898a6618b0SBartosz Markowski ath10k_wmi_event_rtt_error_report(ar, skb); 59908a6618b0SBartosz Markowski break; 59918a6618b0SBartosz Markowski case WMI_10X_WOW_WAKEUP_HOST_EVENTID: 59928a6618b0SBartosz Markowski ath10k_wmi_event_wow_wakeup_host(ar, skb); 59938a6618b0SBartosz Markowski break; 59948a6618b0SBartosz Markowski case WMI_10X_DCS_INTERFERENCE_EVENTID: 59958a6618b0SBartosz Markowski ath10k_wmi_event_dcs_interference(ar, skb); 59968a6618b0SBartosz Markowski break; 59978a6618b0SBartosz Markowski case WMI_10X_PDEV_TPC_CONFIG_EVENTID: 59988a6618b0SBartosz Markowski ath10k_wmi_event_pdev_tpc_config(ar, skb); 59998a6618b0SBartosz Markowski break; 60008a6618b0SBartosz Markowski case WMI_10X_INST_RSSI_STATS_EVENTID: 60018a6618b0SBartosz Markowski ath10k_wmi_event_inst_rssi_stats(ar, skb); 60028a6618b0SBartosz Markowski break; 60038a6618b0SBartosz Markowski case WMI_10X_VDEV_STANDBY_REQ_EVENTID: 60048a6618b0SBartosz Markowski ath10k_wmi_event_vdev_standby_req(ar, skb); 60058a6618b0SBartosz Markowski break; 60068a6618b0SBartosz Markowski case WMI_10X_VDEV_RESUME_REQ_EVENTID: 60078a6618b0SBartosz Markowski ath10k_wmi_event_vdev_resume_req(ar, skb); 60088a6618b0SBartosz Markowski break; 60098a6618b0SBartosz Markowski case WMI_10X_SERVICE_READY_EVENTID: 6010b34d2b3dSMichal Kazior ath10k_wmi_event_service_ready(ar, skb); 6011c8ecfc1cSRaja Mani return; 60128a6618b0SBartosz Markowski case WMI_10X_READY_EVENTID: 6013b34d2b3dSMichal Kazior ath10k_wmi_event_ready(ar, skb); 6014ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 60158a6618b0SBartosz Markowski break; 601643d2a30fSKalle Valo case WMI_10X_PDEV_UTF_EVENTID: 601743d2a30fSKalle Valo /* ignore utf events */ 601843d2a30fSKalle Valo break; 60198a6618b0SBartosz Markowski default: 60207aa7a72aSMichal Kazior ath10k_warn(ar, "Unknown eventid: %d\n", id); 60218a6618b0SBartosz Markowski break; 60228a6618b0SBartosz Markowski } 60238a6618b0SBartosz Markowski 602443d2a30fSKalle Valo out: 60258a6618b0SBartosz Markowski dev_kfree_skb(skb); 60268a6618b0SBartosz Markowski } 60278a6618b0SBartosz Markowski 6028d7579d12SMichal Kazior static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb) 602924c88f78SMichal Kazior { 603024c88f78SMichal Kazior struct wmi_cmd_hdr *cmd_hdr; 603124c88f78SMichal Kazior enum wmi_10_2_event_id id; 6032d912fc09STamizh chelvam bool consumed; 603324c88f78SMichal Kazior 603424c88f78SMichal Kazior cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 603524c88f78SMichal Kazior id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 603624c88f78SMichal Kazior 603724c88f78SMichal Kazior if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 6038469d479fSMichal Kazior goto out; 603924c88f78SMichal Kazior 6040d35a6c18SMichal Kazior trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 604124c88f78SMichal Kazior 6042d912fc09STamizh chelvam consumed = ath10k_tm_event_wmi(ar, id, skb); 6043d912fc09STamizh chelvam 6044d912fc09STamizh chelvam /* Ready event must be handled normally also in UTF mode so that we 6045d912fc09STamizh chelvam * know the UTF firmware has booted, others we are just bypass WMI 6046d912fc09STamizh chelvam * events to testmode. 6047d912fc09STamizh chelvam */ 6048d912fc09STamizh chelvam if (consumed && id != WMI_10_2_READY_EVENTID) { 6049d912fc09STamizh chelvam ath10k_dbg(ar, ATH10K_DBG_WMI, 6050d912fc09STamizh chelvam "wmi testmode consumed 0x%x\n", id); 6051d912fc09STamizh chelvam goto out; 6052d912fc09STamizh chelvam } 6053d912fc09STamizh chelvam 605424c88f78SMichal Kazior switch (id) { 605524c88f78SMichal Kazior case WMI_10_2_MGMT_RX_EVENTID: 605624c88f78SMichal Kazior ath10k_wmi_event_mgmt_rx(ar, skb); 605724c88f78SMichal Kazior /* mgmt_rx() owns the skb now! */ 605824c88f78SMichal Kazior return; 605924c88f78SMichal Kazior case WMI_10_2_SCAN_EVENTID: 606024c88f78SMichal Kazior ath10k_wmi_event_scan(ar, skb); 6061ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 606224c88f78SMichal Kazior break; 606324c88f78SMichal Kazior case WMI_10_2_CHAN_INFO_EVENTID: 606424c88f78SMichal Kazior ath10k_wmi_event_chan_info(ar, skb); 606524c88f78SMichal Kazior break; 606624c88f78SMichal Kazior case WMI_10_2_ECHO_EVENTID: 606724c88f78SMichal Kazior ath10k_wmi_event_echo(ar, skb); 606824c88f78SMichal Kazior break; 606924c88f78SMichal Kazior case WMI_10_2_DEBUG_MESG_EVENTID: 607024c88f78SMichal Kazior ath10k_wmi_event_debug_mesg(ar, skb); 6071ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 607224c88f78SMichal Kazior break; 607324c88f78SMichal Kazior case WMI_10_2_UPDATE_STATS_EVENTID: 607424c88f78SMichal Kazior ath10k_wmi_event_update_stats(ar, skb); 607524c88f78SMichal Kazior break; 607624c88f78SMichal Kazior case WMI_10_2_VDEV_START_RESP_EVENTID: 607724c88f78SMichal Kazior ath10k_wmi_event_vdev_start_resp(ar, skb); 6078ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 607924c88f78SMichal Kazior break; 608024c88f78SMichal Kazior case WMI_10_2_VDEV_STOPPED_EVENTID: 608124c88f78SMichal Kazior ath10k_wmi_event_vdev_stopped(ar, skb); 6082ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 608324c88f78SMichal Kazior break; 608424c88f78SMichal Kazior case WMI_10_2_PEER_STA_KICKOUT_EVENTID: 608524c88f78SMichal Kazior ath10k_wmi_event_peer_sta_kickout(ar, skb); 608624c88f78SMichal Kazior break; 608724c88f78SMichal Kazior case WMI_10_2_HOST_SWBA_EVENTID: 608824c88f78SMichal Kazior ath10k_wmi_event_host_swba(ar, skb); 608924c88f78SMichal Kazior break; 609024c88f78SMichal Kazior case WMI_10_2_TBTTOFFSET_UPDATE_EVENTID: 609124c88f78SMichal Kazior ath10k_wmi_event_tbttoffset_update(ar, skb); 609224c88f78SMichal Kazior break; 609324c88f78SMichal Kazior case WMI_10_2_PHYERR_EVENTID: 609424c88f78SMichal Kazior ath10k_wmi_event_phyerr(ar, skb); 609524c88f78SMichal Kazior break; 609624c88f78SMichal Kazior case WMI_10_2_ROAM_EVENTID: 609724c88f78SMichal Kazior ath10k_wmi_event_roam(ar, skb); 6098ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 609924c88f78SMichal Kazior break; 610024c88f78SMichal Kazior case WMI_10_2_PROFILE_MATCH: 610124c88f78SMichal Kazior ath10k_wmi_event_profile_match(ar, skb); 610224c88f78SMichal Kazior break; 610324c88f78SMichal Kazior case WMI_10_2_DEBUG_PRINT_EVENTID: 610424c88f78SMichal Kazior ath10k_wmi_event_debug_print(ar, skb); 6105ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 610624c88f78SMichal Kazior break; 610724c88f78SMichal Kazior case WMI_10_2_PDEV_QVIT_EVENTID: 610824c88f78SMichal Kazior ath10k_wmi_event_pdev_qvit(ar, skb); 610924c88f78SMichal Kazior break; 611024c88f78SMichal Kazior case WMI_10_2_WLAN_PROFILE_DATA_EVENTID: 611124c88f78SMichal Kazior ath10k_wmi_event_wlan_profile_data(ar, skb); 611224c88f78SMichal Kazior break; 611324c88f78SMichal Kazior case WMI_10_2_RTT_MEASUREMENT_REPORT_EVENTID: 611424c88f78SMichal Kazior ath10k_wmi_event_rtt_measurement_report(ar, skb); 611524c88f78SMichal Kazior break; 611624c88f78SMichal Kazior case WMI_10_2_TSF_MEASUREMENT_REPORT_EVENTID: 611724c88f78SMichal Kazior ath10k_wmi_event_tsf_measurement_report(ar, skb); 611824c88f78SMichal Kazior break; 611924c88f78SMichal Kazior case WMI_10_2_RTT_ERROR_REPORT_EVENTID: 612024c88f78SMichal Kazior ath10k_wmi_event_rtt_error_report(ar, skb); 612124c88f78SMichal Kazior break; 612224c88f78SMichal Kazior case WMI_10_2_WOW_WAKEUP_HOST_EVENTID: 612324c88f78SMichal Kazior ath10k_wmi_event_wow_wakeup_host(ar, skb); 612424c88f78SMichal Kazior break; 612524c88f78SMichal Kazior case WMI_10_2_DCS_INTERFERENCE_EVENTID: 612624c88f78SMichal Kazior ath10k_wmi_event_dcs_interference(ar, skb); 612724c88f78SMichal Kazior break; 612824c88f78SMichal Kazior case WMI_10_2_PDEV_TPC_CONFIG_EVENTID: 612924c88f78SMichal Kazior ath10k_wmi_event_pdev_tpc_config(ar, skb); 613024c88f78SMichal Kazior break; 613124c88f78SMichal Kazior case WMI_10_2_INST_RSSI_STATS_EVENTID: 613224c88f78SMichal Kazior ath10k_wmi_event_inst_rssi_stats(ar, skb); 613324c88f78SMichal Kazior break; 613424c88f78SMichal Kazior case WMI_10_2_VDEV_STANDBY_REQ_EVENTID: 613524c88f78SMichal Kazior ath10k_wmi_event_vdev_standby_req(ar, skb); 6136ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 613724c88f78SMichal Kazior break; 613824c88f78SMichal Kazior case WMI_10_2_VDEV_RESUME_REQ_EVENTID: 613924c88f78SMichal Kazior ath10k_wmi_event_vdev_resume_req(ar, skb); 6140ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 614124c88f78SMichal Kazior break; 614224c88f78SMichal Kazior case WMI_10_2_SERVICE_READY_EVENTID: 6143b34d2b3dSMichal Kazior ath10k_wmi_event_service_ready(ar, skb); 6144c8ecfc1cSRaja Mani return; 614524c88f78SMichal Kazior case WMI_10_2_READY_EVENTID: 6146b34d2b3dSMichal Kazior ath10k_wmi_event_ready(ar, skb); 6147ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 614824c88f78SMichal Kazior break; 6149a57a6a27SRajkumar Manoharan case WMI_10_2_PDEV_TEMPERATURE_EVENTID: 6150a57a6a27SRajkumar Manoharan ath10k_wmi_event_temperature(ar, skb); 6151a57a6a27SRajkumar Manoharan break; 615289d2d183SRajkumar Manoharan case WMI_10_2_PDEV_BSS_CHAN_INFO_EVENTID: 615389d2d183SRajkumar Manoharan ath10k_wmi_event_pdev_bss_chan_info(ar, skb); 615489d2d183SRajkumar Manoharan break; 615524c88f78SMichal Kazior case WMI_10_2_RTT_KEEPALIVE_EVENTID: 615624c88f78SMichal Kazior case WMI_10_2_GPIO_INPUT_EVENTID: 615724c88f78SMichal Kazior case WMI_10_2_PEER_RATECODE_LIST_EVENTID: 615824c88f78SMichal Kazior case WMI_10_2_GENERIC_BUFFER_EVENTID: 615924c88f78SMichal Kazior case WMI_10_2_MCAST_BUF_RELEASE_EVENTID: 616024c88f78SMichal Kazior case WMI_10_2_MCAST_LIST_AGEOUT_EVENTID: 616124c88f78SMichal Kazior case WMI_10_2_WDS_PEER_EVENTID: 61627aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 616324c88f78SMichal Kazior "received event id %d not implemented\n", id); 616424c88f78SMichal Kazior break; 6165d70c0d46SMaharaja Kennadyrajan case WMI_10_2_PEER_STA_PS_STATECHG_EVENTID: 6166d70c0d46SMaharaja Kennadyrajan ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb); 6167d70c0d46SMaharaja Kennadyrajan break; 616824c88f78SMichal Kazior default: 61697aa7a72aSMichal Kazior ath10k_warn(ar, "Unknown eventid: %d\n", id); 617024c88f78SMichal Kazior break; 617124c88f78SMichal Kazior } 617224c88f78SMichal Kazior 6173469d479fSMichal Kazior out: 617424c88f78SMichal Kazior dev_kfree_skb(skb); 617524c88f78SMichal Kazior } 61768a6618b0SBartosz Markowski 61771c092961SRaja Mani static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb) 61781c092961SRaja Mani { 61791c092961SRaja Mani struct wmi_cmd_hdr *cmd_hdr; 61801c092961SRaja Mani enum wmi_10_4_event_id id; 6181d912fc09STamizh chelvam bool consumed; 61821c092961SRaja Mani 61831c092961SRaja Mani cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 61841c092961SRaja Mani id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 61851c092961SRaja Mani 61861c092961SRaja Mani if (!skb_pull(skb, sizeof(struct wmi_cmd_hdr))) 61871c092961SRaja Mani goto out; 61881c092961SRaja Mani 61891c092961SRaja Mani trace_ath10k_wmi_event(ar, id, skb->data, skb->len); 61901c092961SRaja Mani 6191d912fc09STamizh chelvam consumed = ath10k_tm_event_wmi(ar, id, skb); 6192d912fc09STamizh chelvam 6193d912fc09STamizh chelvam /* Ready event must be handled normally also in UTF mode so that we 6194d912fc09STamizh chelvam * know the UTF firmware has booted, others we are just bypass WMI 6195d912fc09STamizh chelvam * events to testmode. 6196d912fc09STamizh chelvam */ 6197d912fc09STamizh chelvam if (consumed && id != WMI_10_4_READY_EVENTID) { 6198d912fc09STamizh chelvam ath10k_dbg(ar, ATH10K_DBG_WMI, 6199d912fc09STamizh chelvam "wmi testmode consumed 0x%x\n", id); 6200d912fc09STamizh chelvam goto out; 6201d912fc09STamizh chelvam } 6202d912fc09STamizh chelvam 62031c092961SRaja Mani switch (id) { 62041c092961SRaja Mani case WMI_10_4_MGMT_RX_EVENTID: 62051c092961SRaja Mani ath10k_wmi_event_mgmt_rx(ar, skb); 62061c092961SRaja Mani /* mgmt_rx() owns the skb now! */ 62071c092961SRaja Mani return; 6208373b48cfSRaja Mani case WMI_10_4_ECHO_EVENTID: 6209373b48cfSRaja Mani ath10k_wmi_event_echo(ar, skb); 6210373b48cfSRaja Mani break; 6211373b48cfSRaja Mani case WMI_10_4_DEBUG_MESG_EVENTID: 6212373b48cfSRaja Mani ath10k_wmi_event_debug_mesg(ar, skb); 6213ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 6214373b48cfSRaja Mani break; 6215373b48cfSRaja Mani case WMI_10_4_SERVICE_READY_EVENTID: 6216373b48cfSRaja Mani ath10k_wmi_event_service_ready(ar, skb); 6217c8ecfc1cSRaja Mani return; 6218b2297baaSRaja Mani case WMI_10_4_SCAN_EVENTID: 6219b2297baaSRaja Mani ath10k_wmi_event_scan(ar, skb); 6220ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 6221b2297baaSRaja Mani break; 6222b2297baaSRaja Mani case WMI_10_4_CHAN_INFO_EVENTID: 6223b2297baaSRaja Mani ath10k_wmi_event_chan_info(ar, skb); 6224b2297baaSRaja Mani break; 62252b0a2e0dSRaja Mani case WMI_10_4_PHYERR_EVENTID: 62262b0a2e0dSRaja Mani ath10k_wmi_event_phyerr(ar, skb); 62272b0a2e0dSRaja Mani break; 6228d02e752fSRaja Mani case WMI_10_4_READY_EVENTID: 6229d02e752fSRaja Mani ath10k_wmi_event_ready(ar, skb); 6230ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 6231d02e752fSRaja Mani break; 6232373b48cfSRaja Mani case WMI_10_4_PEER_STA_KICKOUT_EVENTID: 6233373b48cfSRaja Mani ath10k_wmi_event_peer_sta_kickout(ar, skb); 6234373b48cfSRaja Mani break; 6235343bf960SMohammed Shafi Shajakhan case WMI_10_4_ROAM_EVENTID: 6236343bf960SMohammed Shafi Shajakhan ath10k_wmi_event_roam(ar, skb); 6237ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 6238343bf960SMohammed Shafi Shajakhan break; 62393cec3be3SRaja Mani case WMI_10_4_HOST_SWBA_EVENTID: 62403cec3be3SRaja Mani ath10k_wmi_event_host_swba(ar, skb); 62413cec3be3SRaja Mani break; 6242373b48cfSRaja Mani case WMI_10_4_TBTTOFFSET_UPDATE_EVENTID: 6243373b48cfSRaja Mani ath10k_wmi_event_tbttoffset_update(ar, skb); 6244373b48cfSRaja Mani break; 6245373b48cfSRaja Mani case WMI_10_4_DEBUG_PRINT_EVENTID: 6246373b48cfSRaja Mani ath10k_wmi_event_debug_print(ar, skb); 6247ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 6248373b48cfSRaja Mani break; 6249373b48cfSRaja Mani case WMI_10_4_VDEV_START_RESP_EVENTID: 6250373b48cfSRaja Mani ath10k_wmi_event_vdev_start_resp(ar, skb); 6251ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 6252373b48cfSRaja Mani break; 6253373b48cfSRaja Mani case WMI_10_4_VDEV_STOPPED_EVENTID: 6254373b48cfSRaja Mani ath10k_wmi_event_vdev_stopped(ar, skb); 6255ebee76f7SBenjamin Berg ath10k_wmi_queue_set_coverage_class_work(ar); 6256373b48cfSRaja Mani break; 6257373b48cfSRaja Mani case WMI_10_4_WOW_WAKEUP_HOST_EVENTID: 625836bd39bbSVasanthakumar Thiagarajan case WMI_10_4_PEER_RATECODE_LIST_EVENTID: 625903c41cc1SMohammed Shafi Shajakhan case WMI_10_4_WDS_PEER_EVENTID: 6260606204bbSSathishkumar Muruganandam case WMI_10_4_DEBUG_FATAL_CONDITION_EVENTID: 6261373b48cfSRaja Mani ath10k_dbg(ar, ATH10K_DBG_WMI, 6262373b48cfSRaja Mani "received event id %d not implemented\n", id); 6263373b48cfSRaja Mani break; 626498dd2b92SManikanta Pubbisetty case WMI_10_4_UPDATE_STATS_EVENTID: 626598dd2b92SManikanta Pubbisetty ath10k_wmi_event_update_stats(ar, skb); 626698dd2b92SManikanta Pubbisetty break; 62676dd46348STamizh chelvam case WMI_10_4_PDEV_TEMPERATURE_EVENTID: 62686dd46348STamizh chelvam ath10k_wmi_event_temperature(ar, skb); 62696dd46348STamizh chelvam break; 627089d2d183SRajkumar Manoharan case WMI_10_4_PDEV_BSS_CHAN_INFO_EVENTID: 627189d2d183SRajkumar Manoharan ath10k_wmi_event_pdev_bss_chan_info(ar, skb); 627289d2d183SRajkumar Manoharan break; 6273ac86aa57SMaharaja Kennadyrajan case WMI_10_4_PDEV_TPC_CONFIG_EVENTID: 6274ac86aa57SMaharaja Kennadyrajan ath10k_wmi_event_pdev_tpc_config(ar, skb); 6275ac86aa57SMaharaja Kennadyrajan break; 62768ed05ed0SManikanta Pubbisetty case WMI_10_4_TDLS_PEER_EVENTID: 62778ed05ed0SManikanta Pubbisetty ath10k_wmi_handle_tdls_peer_event(ar, skb); 62788ed05ed0SManikanta Pubbisetty break; 6279bc64d052SMaharaja Kennadyrajan case WMI_10_4_PDEV_TPC_TABLE_EVENTID: 6280bc64d052SMaharaja Kennadyrajan ath10k_wmi_event_tpc_final_table(ar, skb); 6281bc64d052SMaharaja Kennadyrajan break; 62826f6eb1bcSSriram R case WMI_10_4_DFS_STATUS_CHECK_EVENTID: 62836f6eb1bcSSriram R ath10k_wmi_event_dfs_status_check(ar, skb); 62846f6eb1bcSSriram R break; 6285d70c0d46SMaharaja Kennadyrajan case WMI_10_4_PEER_STA_PS_STATECHG_EVENTID: 6286d70c0d46SMaharaja Kennadyrajan ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb); 6287d70c0d46SMaharaja Kennadyrajan break; 62881c092961SRaja Mani default: 62891c092961SRaja Mani ath10k_warn(ar, "Unknown eventid: %d\n", id); 62901c092961SRaja Mani break; 62911c092961SRaja Mani } 62921c092961SRaja Mani 62931c092961SRaja Mani out: 62941c092961SRaja Mani dev_kfree_skb(skb); 62951c092961SRaja Mani } 62961c092961SRaja Mani 6297ce42870eSBartosz Markowski static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb) 6298ce42870eSBartosz Markowski { 6299d7579d12SMichal Kazior int ret; 6300d7579d12SMichal Kazior 6301d7579d12SMichal Kazior ret = ath10k_wmi_rx(ar, skb); 6302d7579d12SMichal Kazior if (ret) 6303d7579d12SMichal Kazior ath10k_warn(ar, "failed to process wmi rx: %d\n", ret); 630424c88f78SMichal Kazior } 6305ce42870eSBartosz Markowski 630695bf21f9SMichal Kazior int ath10k_wmi_connect(struct ath10k *ar) 63075e3dd157SKalle Valo { 63085e3dd157SKalle Valo int status; 63095e3dd157SKalle Valo struct ath10k_htc_svc_conn_req conn_req; 63105e3dd157SKalle Valo struct ath10k_htc_svc_conn_resp conn_resp; 63115e3dd157SKalle Valo 6312cea19a6cSCarl Huang memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map)); 6313cea19a6cSCarl Huang 63145e3dd157SKalle Valo memset(&conn_req, 0, sizeof(conn_req)); 63155e3dd157SKalle Valo memset(&conn_resp, 0, sizeof(conn_resp)); 63165e3dd157SKalle Valo 63175e3dd157SKalle Valo /* these fields are the same for all service endpoints */ 63185e3dd157SKalle Valo conn_req.ep_ops.ep_tx_complete = ath10k_wmi_htc_tx_complete; 63195e3dd157SKalle Valo conn_req.ep_ops.ep_rx_complete = ath10k_wmi_process_rx; 6320be8b3943SMichal Kazior conn_req.ep_ops.ep_tx_credits = ath10k_wmi_op_ep_tx_credits; 63215e3dd157SKalle Valo 63225e3dd157SKalle Valo /* connect to control service */ 63235e3dd157SKalle Valo conn_req.service_id = ATH10K_HTC_SVC_ID_WMI_CONTROL; 63245e3dd157SKalle Valo 6325cd003fadSMichal Kazior status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp); 63265e3dd157SKalle Valo if (status) { 63277aa7a72aSMichal Kazior ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n", 63285e3dd157SKalle Valo status); 63295e3dd157SKalle Valo return status; 63305e3dd157SKalle Valo } 63315e3dd157SKalle Valo 63325e3dd157SKalle Valo ar->wmi.eid = conn_resp.eid; 63335e3dd157SKalle Valo return 0; 63345e3dd157SKalle Valo } 63355e3dd157SKalle Valo 6336d7579d12SMichal Kazior static struct sk_buff * 633705e7ba24SChristian Lamparter ath10k_wmi_op_gen_pdev_set_base_macaddr(struct ath10k *ar, 633805e7ba24SChristian Lamparter const u8 macaddr[ETH_ALEN]) 633905e7ba24SChristian Lamparter { 634005e7ba24SChristian Lamparter struct wmi_pdev_set_base_macaddr_cmd *cmd; 634105e7ba24SChristian Lamparter struct sk_buff *skb; 634205e7ba24SChristian Lamparter 634305e7ba24SChristian Lamparter skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 634405e7ba24SChristian Lamparter if (!skb) 634505e7ba24SChristian Lamparter return ERR_PTR(-ENOMEM); 634605e7ba24SChristian Lamparter 634705e7ba24SChristian Lamparter cmd = (struct wmi_pdev_set_base_macaddr_cmd *)skb->data; 634805e7ba24SChristian Lamparter ether_addr_copy(cmd->mac_addr.addr, macaddr); 634905e7ba24SChristian Lamparter 635005e7ba24SChristian Lamparter ath10k_dbg(ar, ATH10K_DBG_WMI, 635105e7ba24SChristian Lamparter "wmi pdev basemac %pM\n", macaddr); 635205e7ba24SChristian Lamparter return skb; 635305e7ba24SChristian Lamparter } 635405e7ba24SChristian Lamparter 635505e7ba24SChristian Lamparter static struct sk_buff * 6356d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g, 6357d7579d12SMichal Kazior u16 ctl2g, u16 ctl5g, 6358d7579d12SMichal Kazior enum wmi_dfs_region dfs_reg) 63595e3dd157SKalle Valo { 63605e3dd157SKalle Valo struct wmi_pdev_set_regdomain_cmd *cmd; 63615e3dd157SKalle Valo struct sk_buff *skb; 63625e3dd157SKalle Valo 63637aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 63645e3dd157SKalle Valo if (!skb) 6365d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 63665e3dd157SKalle Valo 63675e3dd157SKalle Valo cmd = (struct wmi_pdev_set_regdomain_cmd *)skb->data; 63685e3dd157SKalle Valo cmd->reg_domain = __cpu_to_le32(rd); 63695e3dd157SKalle Valo cmd->reg_domain_2G = __cpu_to_le32(rd2g); 63705e3dd157SKalle Valo cmd->reg_domain_5G = __cpu_to_le32(rd5g); 63715e3dd157SKalle Valo cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g); 63725e3dd157SKalle Valo cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g); 63735e3dd157SKalle Valo 63747aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 63755e3dd157SKalle Valo "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n", 63765e3dd157SKalle Valo rd, rd2g, rd5g, ctl2g, ctl5g); 6377d7579d12SMichal Kazior return skb; 63785e3dd157SKalle Valo } 63795e3dd157SKalle Valo 6380d7579d12SMichal Kazior static struct sk_buff * 6381d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 6382d7579d12SMichal Kazior rd5g, u16 ctl2g, u16 ctl5g, 6383821af6aeSMarek Puzyniak enum wmi_dfs_region dfs_reg) 6384821af6aeSMarek Puzyniak { 6385821af6aeSMarek Puzyniak struct wmi_pdev_set_regdomain_cmd_10x *cmd; 6386821af6aeSMarek Puzyniak struct sk_buff *skb; 6387821af6aeSMarek Puzyniak 63887aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 6389821af6aeSMarek Puzyniak if (!skb) 6390d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 6391821af6aeSMarek Puzyniak 6392821af6aeSMarek Puzyniak cmd = (struct wmi_pdev_set_regdomain_cmd_10x *)skb->data; 6393821af6aeSMarek Puzyniak cmd->reg_domain = __cpu_to_le32(rd); 6394821af6aeSMarek Puzyniak cmd->reg_domain_2G = __cpu_to_le32(rd2g); 6395821af6aeSMarek Puzyniak cmd->reg_domain_5G = __cpu_to_le32(rd5g); 6396821af6aeSMarek Puzyniak cmd->conformance_test_limit_2G = __cpu_to_le32(ctl2g); 6397821af6aeSMarek Puzyniak cmd->conformance_test_limit_5G = __cpu_to_le32(ctl5g); 6398821af6aeSMarek Puzyniak cmd->dfs_domain = __cpu_to_le32(dfs_reg); 6399821af6aeSMarek Puzyniak 64007aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 6401821af6aeSMarek Puzyniak "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x dfs_region %x\n", 6402821af6aeSMarek Puzyniak rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg); 6403d7579d12SMichal Kazior return skb; 6404821af6aeSMarek Puzyniak } 6405821af6aeSMarek Puzyniak 6406d7579d12SMichal Kazior static struct sk_buff * 6407d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt) 64085e3dd157SKalle Valo { 64095e3dd157SKalle Valo struct wmi_pdev_suspend_cmd *cmd; 64105e3dd157SKalle Valo struct sk_buff *skb; 64115e3dd157SKalle Valo 64127aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 64135e3dd157SKalle Valo if (!skb) 6414d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 64155e3dd157SKalle Valo 64165e3dd157SKalle Valo cmd = (struct wmi_pdev_suspend_cmd *)skb->data; 641700f5482bSMarek Puzyniak cmd->suspend_opt = __cpu_to_le32(suspend_opt); 64185e3dd157SKalle Valo 6419d7579d12SMichal Kazior return skb; 64205e3dd157SKalle Valo } 64215e3dd157SKalle Valo 6422d7579d12SMichal Kazior static struct sk_buff * 6423d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar) 64245e3dd157SKalle Valo { 64255e3dd157SKalle Valo struct sk_buff *skb; 64265e3dd157SKalle Valo 64277aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, 0); 6428d7579d12SMichal Kazior if (!skb) 6429d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 64305e3dd157SKalle Valo 6431d7579d12SMichal Kazior return skb; 64325e3dd157SKalle Valo } 64335e3dd157SKalle Valo 6434d7579d12SMichal Kazior static struct sk_buff * 6435d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value) 64365e3dd157SKalle Valo { 64375e3dd157SKalle Valo struct wmi_pdev_set_param_cmd *cmd; 64385e3dd157SKalle Valo struct sk_buff *skb; 64395e3dd157SKalle Valo 6440226a339bSBartosz Markowski if (id == WMI_PDEV_PARAM_UNSUPPORTED) { 64417aa7a72aSMichal Kazior ath10k_warn(ar, "pdev param %d not supported by firmware\n", 64427aa7a72aSMichal Kazior id); 6443d7579d12SMichal Kazior return ERR_PTR(-EOPNOTSUPP); 6444226a339bSBartosz Markowski } 6445226a339bSBartosz Markowski 64467aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 64475e3dd157SKalle Valo if (!skb) 6448d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 64495e3dd157SKalle Valo 64505e3dd157SKalle Valo cmd = (struct wmi_pdev_set_param_cmd *)skb->data; 64515e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(id); 64525e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(value); 64535e3dd157SKalle Valo 64547aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n", 64555e3dd157SKalle Valo id, value); 6456d7579d12SMichal Kazior return skb; 64575e3dd157SKalle Valo } 64585e3dd157SKalle Valo 64590226d602SMichal Kazior void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar, 6460cf9fca8fSMichal Kazior struct wmi_host_mem_chunks *chunks) 6461cf9fca8fSMichal Kazior { 6462cf9fca8fSMichal Kazior struct host_memory_chunk *chunk; 6463cf9fca8fSMichal Kazior int i; 6464cf9fca8fSMichal Kazior 6465cf9fca8fSMichal Kazior chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks); 6466cf9fca8fSMichal Kazior 6467cf9fca8fSMichal Kazior for (i = 0; i < ar->wmi.num_mem_chunks; i++) { 6468cf9fca8fSMichal Kazior chunk = &chunks->items[i]; 6469cf9fca8fSMichal Kazior chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr); 6470cf9fca8fSMichal Kazior chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len); 6471cf9fca8fSMichal Kazior chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id); 6472cf9fca8fSMichal Kazior 6473cf9fca8fSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 6474cf9fca8fSMichal Kazior "wmi chunk %d len %d requested, addr 0x%llx\n", 6475cf9fca8fSMichal Kazior i, 6476cf9fca8fSMichal Kazior ar->wmi.mem_chunks[i].len, 6477cf9fca8fSMichal Kazior (unsigned long long)ar->wmi.mem_chunks[i].paddr); 6478cf9fca8fSMichal Kazior } 6479cf9fca8fSMichal Kazior } 6480cf9fca8fSMichal Kazior 6481d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar) 64825e3dd157SKalle Valo { 64835e3dd157SKalle Valo struct wmi_init_cmd *cmd; 64845e3dd157SKalle Valo struct sk_buff *buf; 64855e3dd157SKalle Valo struct wmi_resource_config config = {}; 6486b3effe61SBartosz Markowski u32 len, val; 64875e3dd157SKalle Valo 64885e3dd157SKalle Valo config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS); 6489cfd1061eSMichal Kazior config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS); 64905e3dd157SKalle Valo config.num_offload_peers = __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS); 64915e3dd157SKalle Valo 64925e3dd157SKalle Valo config.num_offload_reorder_bufs = 64935e3dd157SKalle Valo __cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS); 64945e3dd157SKalle Valo 64955e3dd157SKalle Valo config.num_peer_keys = __cpu_to_le32(TARGET_NUM_PEER_KEYS); 64965e3dd157SKalle Valo config.num_tids = __cpu_to_le32(TARGET_NUM_TIDS); 64975e3dd157SKalle Valo config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT); 64985e3dd157SKalle Valo config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK); 64995e3dd157SKalle Valo config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK); 65005e3dd157SKalle Valo config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 65015e3dd157SKalle Valo config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 65025e3dd157SKalle Valo config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); 65035e3dd157SKalle Valo config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI); 6504ccec9038SDavid Liu config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 65055e3dd157SKalle Valo config.scan_max_pending_reqs = 65065e3dd157SKalle Valo __cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS); 65075e3dd157SKalle Valo 65085e3dd157SKalle Valo config.bmiss_offload_max_vdev = 65095e3dd157SKalle Valo __cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV); 65105e3dd157SKalle Valo 65115e3dd157SKalle Valo config.roam_offload_max_vdev = 65125e3dd157SKalle Valo __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV); 65135e3dd157SKalle Valo 65145e3dd157SKalle Valo config.roam_offload_max_ap_profiles = 65155e3dd157SKalle Valo __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES); 65165e3dd157SKalle Valo 65175e3dd157SKalle Valo config.num_mcast_groups = __cpu_to_le32(TARGET_NUM_MCAST_GROUPS); 65185e3dd157SKalle Valo config.num_mcast_table_elems = 65195e3dd157SKalle Valo __cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS); 65205e3dd157SKalle Valo 65215e3dd157SKalle Valo config.mcast2ucast_mode = __cpu_to_le32(TARGET_MCAST2UCAST_MODE); 65225e3dd157SKalle Valo config.tx_dbg_log_size = __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE); 65235e3dd157SKalle Valo config.num_wds_entries = __cpu_to_le32(TARGET_NUM_WDS_ENTRIES); 65245e3dd157SKalle Valo config.dma_burst_size = __cpu_to_le32(TARGET_DMA_BURST_SIZE); 65255e3dd157SKalle Valo config.mac_aggr_delim = __cpu_to_le32(TARGET_MAC_AGGR_DELIM); 65265e3dd157SKalle Valo 65275e3dd157SKalle Valo val = TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 65285e3dd157SKalle Valo config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 65295e3dd157SKalle Valo 65305e3dd157SKalle Valo config.vow_config = __cpu_to_le32(TARGET_VOW_CONFIG); 65315e3dd157SKalle Valo 65325e3dd157SKalle Valo config.gtk_offload_max_vdev = 65335e3dd157SKalle Valo __cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV); 65345e3dd157SKalle Valo 65355e3dd157SKalle Valo config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC); 65365e3dd157SKalle Valo config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES); 65375e3dd157SKalle Valo 6538b3effe61SBartosz Markowski len = sizeof(*cmd) + 6539b3effe61SBartosz Markowski (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); 6540b3effe61SBartosz Markowski 65417aa7a72aSMichal Kazior buf = ath10k_wmi_alloc_skb(ar, len); 65425e3dd157SKalle Valo if (!buf) 6543d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 65445e3dd157SKalle Valo 65455e3dd157SKalle Valo cmd = (struct wmi_init_cmd *)buf->data; 6546b3effe61SBartosz Markowski 65475e3dd157SKalle Valo memcpy(&cmd->resource_config, &config, sizeof(config)); 6548cf9fca8fSMichal Kazior ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 65495e3dd157SKalle Valo 65507aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n"); 6551d7579d12SMichal Kazior return buf; 65525e3dd157SKalle Valo } 65535e3dd157SKalle Valo 6554d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar) 655512b2b9e3SBartosz Markowski { 655612b2b9e3SBartosz Markowski struct wmi_init_cmd_10x *cmd; 655712b2b9e3SBartosz Markowski struct sk_buff *buf; 655812b2b9e3SBartosz Markowski struct wmi_resource_config_10x config = {}; 655912b2b9e3SBartosz Markowski u32 len, val; 656012b2b9e3SBartosz Markowski 6561ec6a73f0SBartosz Markowski config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS); 6562ec6a73f0SBartosz Markowski config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS); 6563ec6a73f0SBartosz Markowski config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS); 6564ec6a73f0SBartosz Markowski config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); 6565ec6a73f0SBartosz Markowski config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT); 6566ec6a73f0SBartosz Markowski config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); 6567ec6a73f0SBartosz Markowski config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); 6568ec6a73f0SBartosz Markowski config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6569ec6a73f0SBartosz Markowski config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6570ec6a73f0SBartosz Markowski config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 6571ec6a73f0SBartosz Markowski config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI); 6572ccec9038SDavid Liu config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 657312b2b9e3SBartosz Markowski config.scan_max_pending_reqs = 6574ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS); 657512b2b9e3SBartosz Markowski 657612b2b9e3SBartosz Markowski config.bmiss_offload_max_vdev = 6577ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV); 657812b2b9e3SBartosz Markowski 657912b2b9e3SBartosz Markowski config.roam_offload_max_vdev = 6580ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV); 658112b2b9e3SBartosz Markowski 658212b2b9e3SBartosz Markowski config.roam_offload_max_ap_profiles = 6583ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES); 658412b2b9e3SBartosz Markowski 6585ec6a73f0SBartosz Markowski config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS); 658612b2b9e3SBartosz Markowski config.num_mcast_table_elems = 6587ec6a73f0SBartosz Markowski __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS); 658812b2b9e3SBartosz Markowski 6589ec6a73f0SBartosz Markowski config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE); 6590ec6a73f0SBartosz Markowski config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE); 6591ec6a73f0SBartosz Markowski config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES); 6592ec6a73f0SBartosz Markowski config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE); 6593ec6a73f0SBartosz Markowski config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM); 659412b2b9e3SBartosz Markowski 6595ec6a73f0SBartosz Markowski val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 659612b2b9e3SBartosz Markowski config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 659712b2b9e3SBartosz Markowski 6598ec6a73f0SBartosz Markowski config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG); 659912b2b9e3SBartosz Markowski 6600ec6a73f0SBartosz Markowski config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC); 6601ec6a73f0SBartosz Markowski config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES); 660212b2b9e3SBartosz Markowski 660312b2b9e3SBartosz Markowski len = sizeof(*cmd) + 660412b2b9e3SBartosz Markowski (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); 660512b2b9e3SBartosz Markowski 66067aa7a72aSMichal Kazior buf = ath10k_wmi_alloc_skb(ar, len); 660712b2b9e3SBartosz Markowski if (!buf) 6608d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 660912b2b9e3SBartosz Markowski 661012b2b9e3SBartosz Markowski cmd = (struct wmi_init_cmd_10x *)buf->data; 661112b2b9e3SBartosz Markowski 661212b2b9e3SBartosz Markowski memcpy(&cmd->resource_config, &config, sizeof(config)); 6613cf9fca8fSMichal Kazior ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 661412b2b9e3SBartosz Markowski 66157aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n"); 6616d7579d12SMichal Kazior return buf; 661712b2b9e3SBartosz Markowski } 661812b2b9e3SBartosz Markowski 6619d7579d12SMichal Kazior static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar) 662024c88f78SMichal Kazior { 662124c88f78SMichal Kazior struct wmi_init_cmd_10_2 *cmd; 662224c88f78SMichal Kazior struct sk_buff *buf; 662324c88f78SMichal Kazior struct wmi_resource_config_10x config = {}; 6624b6c8e287SSujith Manoharan u32 len, val, features; 662524c88f78SMichal Kazior 662624c88f78SMichal Kazior config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS); 662724c88f78SMichal Kazior config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS); 6628cc61a1bbSMohammed Shafi Shajakhan 6629cc61a1bbSMohammed Shafi Shajakhan if (ath10k_peer_stats_enabled(ar)) { 6630af9a6a3aSAnilkumar Kolli config.num_peers = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_PEERS); 6631af9a6a3aSAnilkumar Kolli config.num_tids = __cpu_to_le32(TARGET_10X_TX_STATS_NUM_TIDS); 6632af9a6a3aSAnilkumar Kolli } else { 6633af9a6a3aSAnilkumar Kolli config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS); 663424c88f78SMichal Kazior config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); 6635af9a6a3aSAnilkumar Kolli } 6636af9a6a3aSAnilkumar Kolli 663724c88f78SMichal Kazior config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT); 663824c88f78SMichal Kazior config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); 663924c88f78SMichal Kazior config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); 664024c88f78SMichal Kazior config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 664124c88f78SMichal Kazior config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 664224c88f78SMichal Kazior config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); 664324c88f78SMichal Kazior config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI); 6644ccec9038SDavid Liu config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 664524c88f78SMichal Kazior 664624c88f78SMichal Kazior config.scan_max_pending_reqs = 664724c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS); 664824c88f78SMichal Kazior 664924c88f78SMichal Kazior config.bmiss_offload_max_vdev = 665024c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV); 665124c88f78SMichal Kazior 665224c88f78SMichal Kazior config.roam_offload_max_vdev = 665324c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV); 665424c88f78SMichal Kazior 665524c88f78SMichal Kazior config.roam_offload_max_ap_profiles = 665624c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES); 665724c88f78SMichal Kazior 665824c88f78SMichal Kazior config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS); 665924c88f78SMichal Kazior config.num_mcast_table_elems = 666024c88f78SMichal Kazior __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS); 666124c88f78SMichal Kazior 666224c88f78SMichal Kazior config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE); 666324c88f78SMichal Kazior config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE); 666424c88f78SMichal Kazior config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES); 6665f6603ff2SSujith Manoharan config.dma_burst_size = __cpu_to_le32(TARGET_10_2_DMA_BURST_SIZE); 666624c88f78SMichal Kazior config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM); 666724c88f78SMichal Kazior 666824c88f78SMichal Kazior val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; 666924c88f78SMichal Kazior config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); 667024c88f78SMichal Kazior 667124c88f78SMichal Kazior config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG); 667224c88f78SMichal Kazior 667324c88f78SMichal Kazior config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC); 667424c88f78SMichal Kazior config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES); 667524c88f78SMichal Kazior 667624c88f78SMichal Kazior len = sizeof(*cmd) + 667724c88f78SMichal Kazior (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); 667824c88f78SMichal Kazior 66797aa7a72aSMichal Kazior buf = ath10k_wmi_alloc_skb(ar, len); 668024c88f78SMichal Kazior if (!buf) 6681d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 668224c88f78SMichal Kazior 668324c88f78SMichal Kazior cmd = (struct wmi_init_cmd_10_2 *)buf->data; 668424c88f78SMichal Kazior 6685b6c8e287SSujith Manoharan features = WMI_10_2_RX_BATCH_MODE; 6686844fa572SYanbo Li 6687844fa572SYanbo Li if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) && 6688844fa572SYanbo Li test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map)) 6689de0c789bSYanbo Li features |= WMI_10_2_COEX_GPIO; 6690844fa572SYanbo Li 6691cc61a1bbSMohammed Shafi Shajakhan if (ath10k_peer_stats_enabled(ar)) 6692de46c015SMohammed Shafi Shajakhan features |= WMI_10_2_PEER_STATS; 6693de46c015SMohammed Shafi Shajakhan 6694fa7937e3SRajkumar Manoharan if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map)) 6695fa7937e3SRajkumar Manoharan features |= WMI_10_2_BSS_CHAN_INFO; 6696fa7937e3SRajkumar Manoharan 6697b6c8e287SSujith Manoharan cmd->resource_config.feature_mask = __cpu_to_le32(features); 6698b6c8e287SSujith Manoharan 669924c88f78SMichal Kazior memcpy(&cmd->resource_config.common, &config, sizeof(config)); 6700cf9fca8fSMichal Kazior ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 670124c88f78SMichal Kazior 67027aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n"); 6703d7579d12SMichal Kazior return buf; 670412b2b9e3SBartosz Markowski } 670512b2b9e3SBartosz Markowski 6706d1e52a8eSRaja Mani static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar) 6707d1e52a8eSRaja Mani { 6708d1e52a8eSRaja Mani struct wmi_init_cmd_10_4 *cmd; 6709d1e52a8eSRaja Mani struct sk_buff *buf; 6710d1e52a8eSRaja Mani struct wmi_resource_config_10_4 config = {}; 6711d1e52a8eSRaja Mani u32 len; 6712d1e52a8eSRaja Mani 6713d1e52a8eSRaja Mani config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs); 6714d1e52a8eSRaja Mani config.num_peers = __cpu_to_le32(ar->max_num_peers); 6715d1e52a8eSRaja Mani config.num_active_peers = __cpu_to_le32(ar->num_active_peers); 6716d1e52a8eSRaja Mani config.num_tids = __cpu_to_le32(ar->num_tids); 6717d1e52a8eSRaja Mani 6718d1e52a8eSRaja Mani config.num_offload_peers = __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_PEERS); 6719d1e52a8eSRaja Mani config.num_offload_reorder_buffs = 6720d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_NUM_OFFLOAD_REORDER_BUFFS); 6721d1e52a8eSRaja Mani config.num_peer_keys = __cpu_to_le32(TARGET_10_4_NUM_PEER_KEYS); 6722d1e52a8eSRaja Mani config.ast_skid_limit = __cpu_to_le32(TARGET_10_4_AST_SKID_LIMIT); 67235699a6f2SRaja Mani config.tx_chain_mask = __cpu_to_le32(ar->hw_params.tx_chain_mask); 67245699a6f2SRaja Mani config.rx_chain_mask = __cpu_to_le32(ar->hw_params.rx_chain_mask); 6725d1e52a8eSRaja Mani 6726d1e52a8eSRaja Mani config.rx_timeout_pri[0] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI); 6727d1e52a8eSRaja Mani config.rx_timeout_pri[1] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI); 6728d1e52a8eSRaja Mani config.rx_timeout_pri[2] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_LO_PRI); 6729d1e52a8eSRaja Mani config.rx_timeout_pri[3] = __cpu_to_le32(TARGET_10_4_RX_TIMEOUT_HI_PRI); 6730d1e52a8eSRaja Mani 6731bc27e8cdSPeter Oh config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode); 6732d1e52a8eSRaja Mani config.scan_max_pending_req = __cpu_to_le32(TARGET_10_4_SCAN_MAX_REQS); 6733d1e52a8eSRaja Mani config.bmiss_offload_max_vdev = 6734d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_BMISS_OFFLOAD_MAX_VDEV); 6735d1e52a8eSRaja Mani config.roam_offload_max_vdev = 6736d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_VDEV); 6737d1e52a8eSRaja Mani config.roam_offload_max_ap_profiles = 6738d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_ROAM_OFFLOAD_MAX_PROFILES); 6739d1e52a8eSRaja Mani config.num_mcast_groups = __cpu_to_le32(TARGET_10_4_NUM_MCAST_GROUPS); 6740d1e52a8eSRaja Mani config.num_mcast_table_elems = 6741d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_NUM_MCAST_TABLE_ELEMS); 6742d1e52a8eSRaja Mani 6743d1e52a8eSRaja Mani config.mcast2ucast_mode = __cpu_to_le32(TARGET_10_4_MCAST2UCAST_MODE); 6744d1e52a8eSRaja Mani config.tx_dbg_log_size = __cpu_to_le32(TARGET_10_4_TX_DBG_LOG_SIZE); 6745d1e52a8eSRaja Mani config.num_wds_entries = __cpu_to_le32(TARGET_10_4_NUM_WDS_ENTRIES); 6746d1e52a8eSRaja Mani config.dma_burst_size = __cpu_to_le32(TARGET_10_4_DMA_BURST_SIZE); 6747d1e52a8eSRaja Mani config.mac_aggr_delim = __cpu_to_le32(TARGET_10_4_MAC_AGGR_DELIM); 6748d1e52a8eSRaja Mani 6749d1e52a8eSRaja Mani config.rx_skip_defrag_timeout_dup_detection_check = 6750d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK); 6751d1e52a8eSRaja Mani 6752d1e52a8eSRaja Mani config.vow_config = __cpu_to_le32(TARGET_10_4_VOW_CONFIG); 6753d1e52a8eSRaja Mani config.gtk_offload_max_vdev = 6754d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_GTK_OFFLOAD_MAX_VDEV); 67555699a6f2SRaja Mani config.num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx); 6756d1e52a8eSRaja Mani config.max_frag_entries = __cpu_to_le32(TARGET_10_4_11AC_TX_MAX_FRAGS); 6757d1e52a8eSRaja Mani config.max_peer_ext_stats = 6758d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_MAX_PEER_EXT_STATS); 6759d1e52a8eSRaja Mani config.smart_ant_cap = __cpu_to_le32(TARGET_10_4_SMART_ANT_CAP); 6760d1e52a8eSRaja Mani 6761d1e52a8eSRaja Mani config.bk_minfree = __cpu_to_le32(TARGET_10_4_BK_MIN_FREE); 6762d1e52a8eSRaja Mani config.be_minfree = __cpu_to_le32(TARGET_10_4_BE_MIN_FREE); 6763d1e52a8eSRaja Mani config.vi_minfree = __cpu_to_le32(TARGET_10_4_VI_MIN_FREE); 6764d1e52a8eSRaja Mani config.vo_minfree = __cpu_to_le32(TARGET_10_4_VO_MIN_FREE); 6765d1e52a8eSRaja Mani 6766d1e52a8eSRaja Mani config.rx_batchmode = __cpu_to_le32(TARGET_10_4_RX_BATCH_MODE); 6767d1e52a8eSRaja Mani config.tt_support = 6768d1e52a8eSRaja Mani __cpu_to_le32(TARGET_10_4_THERMAL_THROTTLING_CONFIG); 6769d1e52a8eSRaja Mani config.atf_config = __cpu_to_le32(TARGET_10_4_ATF_CONFIG); 6770d1e52a8eSRaja Mani config.iphdr_pad_config = __cpu_to_le32(TARGET_10_4_IPHDR_PAD_CONFIG); 6771d1e52a8eSRaja Mani config.qwrap_config = __cpu_to_le32(TARGET_10_4_QWRAP_CONFIG); 6772d1e52a8eSRaja Mani 6773d1e52a8eSRaja Mani len = sizeof(*cmd) + 6774d1e52a8eSRaja Mani (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); 6775d1e52a8eSRaja Mani 6776d1e52a8eSRaja Mani buf = ath10k_wmi_alloc_skb(ar, len); 6777d1e52a8eSRaja Mani if (!buf) 6778d1e52a8eSRaja Mani return ERR_PTR(-ENOMEM); 6779d1e52a8eSRaja Mani 6780d1e52a8eSRaja Mani cmd = (struct wmi_init_cmd_10_4 *)buf->data; 6781d1e52a8eSRaja Mani memcpy(&cmd->resource_config, &config, sizeof(config)); 6782d1e52a8eSRaja Mani ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks); 6783d1e52a8eSRaja Mani 6784d1e52a8eSRaja Mani ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n"); 6785d1e52a8eSRaja Mani return buf; 6786d1e52a8eSRaja Mani } 6787d1e52a8eSRaja Mani 67880226d602SMichal Kazior int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg) 67895e3dd157SKalle Valo { 67905e3dd157SKalle Valo if (arg->ie_len > WLAN_SCAN_PARAMS_MAX_IE_LEN) 67915e3dd157SKalle Valo return -EINVAL; 6792a6aa5da3SMichal Kazior if (arg->n_channels > ARRAY_SIZE(arg->channels)) 6793a6aa5da3SMichal Kazior return -EINVAL; 6794a6aa5da3SMichal Kazior if (arg->n_ssids > WLAN_SCAN_PARAMS_MAX_SSID) 6795a6aa5da3SMichal Kazior return -EINVAL; 6796a6aa5da3SMichal Kazior if (arg->n_bssids > WLAN_SCAN_PARAMS_MAX_BSSID) 6797a6aa5da3SMichal Kazior return -EINVAL; 67985e3dd157SKalle Valo 6799a6aa5da3SMichal Kazior return 0; 6800a6aa5da3SMichal Kazior } 6801a6aa5da3SMichal Kazior 6802a6aa5da3SMichal Kazior static size_t 6803a6aa5da3SMichal Kazior ath10k_wmi_start_scan_tlvs_len(const struct wmi_start_scan_arg *arg) 6804a6aa5da3SMichal Kazior { 6805a6aa5da3SMichal Kazior int len = 0; 6806a6aa5da3SMichal Kazior 6807a6aa5da3SMichal Kazior if (arg->ie_len) { 68085e3dd157SKalle Valo len += sizeof(struct wmi_ie_data); 68095e3dd157SKalle Valo len += roundup(arg->ie_len, 4); 68105e3dd157SKalle Valo } 68115e3dd157SKalle Valo 68125e3dd157SKalle Valo if (arg->n_channels) { 68135e3dd157SKalle Valo len += sizeof(struct wmi_chan_list); 68145e3dd157SKalle Valo len += sizeof(__le32) * arg->n_channels; 68155e3dd157SKalle Valo } 68165e3dd157SKalle Valo 68175e3dd157SKalle Valo if (arg->n_ssids) { 68185e3dd157SKalle Valo len += sizeof(struct wmi_ssid_list); 68195e3dd157SKalle Valo len += sizeof(struct wmi_ssid) * arg->n_ssids; 68205e3dd157SKalle Valo } 68215e3dd157SKalle Valo 68225e3dd157SKalle Valo if (arg->n_bssids) { 68235e3dd157SKalle Valo len += sizeof(struct wmi_bssid_list); 68245e3dd157SKalle Valo len += sizeof(struct wmi_mac_addr) * arg->n_bssids; 68255e3dd157SKalle Valo } 68265e3dd157SKalle Valo 68275e3dd157SKalle Valo return len; 68285e3dd157SKalle Valo } 68295e3dd157SKalle Valo 68300226d602SMichal Kazior void ath10k_wmi_put_start_scan_common(struct wmi_start_scan_common *cmn, 68315e3dd157SKalle Valo const struct wmi_start_scan_arg *arg) 68325e3dd157SKalle Valo { 68335e3dd157SKalle Valo u32 scan_id; 68345e3dd157SKalle Valo u32 scan_req_id; 68355e3dd157SKalle Valo 68365e3dd157SKalle Valo scan_id = WMI_HOST_SCAN_REQ_ID_PREFIX; 68375e3dd157SKalle Valo scan_id |= arg->scan_id; 68385e3dd157SKalle Valo 68395e3dd157SKalle Valo scan_req_id = WMI_HOST_SCAN_REQUESTOR_ID_PREFIX; 68405e3dd157SKalle Valo scan_req_id |= arg->scan_req_id; 68415e3dd157SKalle Valo 6842a6aa5da3SMichal Kazior cmn->scan_id = __cpu_to_le32(scan_id); 6843a6aa5da3SMichal Kazior cmn->scan_req_id = __cpu_to_le32(scan_req_id); 6844a6aa5da3SMichal Kazior cmn->vdev_id = __cpu_to_le32(arg->vdev_id); 6845a6aa5da3SMichal Kazior cmn->scan_priority = __cpu_to_le32(arg->scan_priority); 6846a6aa5da3SMichal Kazior cmn->notify_scan_events = __cpu_to_le32(arg->notify_scan_events); 6847a6aa5da3SMichal Kazior cmn->dwell_time_active = __cpu_to_le32(arg->dwell_time_active); 6848a6aa5da3SMichal Kazior cmn->dwell_time_passive = __cpu_to_le32(arg->dwell_time_passive); 6849a6aa5da3SMichal Kazior cmn->min_rest_time = __cpu_to_le32(arg->min_rest_time); 6850a6aa5da3SMichal Kazior cmn->max_rest_time = __cpu_to_le32(arg->max_rest_time); 6851a6aa5da3SMichal Kazior cmn->repeat_probe_time = __cpu_to_le32(arg->repeat_probe_time); 6852a6aa5da3SMichal Kazior cmn->probe_spacing_time = __cpu_to_le32(arg->probe_spacing_time); 6853a6aa5da3SMichal Kazior cmn->idle_time = __cpu_to_le32(arg->idle_time); 6854a6aa5da3SMichal Kazior cmn->max_scan_time = __cpu_to_le32(arg->max_scan_time); 6855a6aa5da3SMichal Kazior cmn->probe_delay = __cpu_to_le32(arg->probe_delay); 6856a6aa5da3SMichal Kazior cmn->scan_ctrl_flags = __cpu_to_le32(arg->scan_ctrl_flags); 6857a6aa5da3SMichal Kazior } 68585e3dd157SKalle Valo 6859a6aa5da3SMichal Kazior static void 6860a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_tlvs(struct wmi_start_scan_tlvs *tlvs, 6861a6aa5da3SMichal Kazior const struct wmi_start_scan_arg *arg) 6862a6aa5da3SMichal Kazior { 6863a6aa5da3SMichal Kazior struct wmi_ie_data *ie; 6864a6aa5da3SMichal Kazior struct wmi_chan_list *channels; 6865a6aa5da3SMichal Kazior struct wmi_ssid_list *ssids; 6866a6aa5da3SMichal Kazior struct wmi_bssid_list *bssids; 6867a6aa5da3SMichal Kazior void *ptr = tlvs->tlvs; 6868a6aa5da3SMichal Kazior int i; 68695e3dd157SKalle Valo 68705e3dd157SKalle Valo if (arg->n_channels) { 6871a6aa5da3SMichal Kazior channels = ptr; 68725e3dd157SKalle Valo channels->tag = __cpu_to_le32(WMI_CHAN_LIST_TAG); 68735e3dd157SKalle Valo channels->num_chan = __cpu_to_le32(arg->n_channels); 68745e3dd157SKalle Valo 68755e3dd157SKalle Valo for (i = 0; i < arg->n_channels; i++) 687624c88f78SMichal Kazior channels->channel_list[i].freq = 687724c88f78SMichal Kazior __cpu_to_le16(arg->channels[i]); 68785e3dd157SKalle Valo 6879a6aa5da3SMichal Kazior ptr += sizeof(*channels); 6880a6aa5da3SMichal Kazior ptr += sizeof(__le32) * arg->n_channels; 68815e3dd157SKalle Valo } 68825e3dd157SKalle Valo 68835e3dd157SKalle Valo if (arg->n_ssids) { 6884a6aa5da3SMichal Kazior ssids = ptr; 68855e3dd157SKalle Valo ssids->tag = __cpu_to_le32(WMI_SSID_LIST_TAG); 68865e3dd157SKalle Valo ssids->num_ssids = __cpu_to_le32(arg->n_ssids); 68875e3dd157SKalle Valo 68885e3dd157SKalle Valo for (i = 0; i < arg->n_ssids; i++) { 68895e3dd157SKalle Valo ssids->ssids[i].ssid_len = 68905e3dd157SKalle Valo __cpu_to_le32(arg->ssids[i].len); 68915e3dd157SKalle Valo memcpy(&ssids->ssids[i].ssid, 68925e3dd157SKalle Valo arg->ssids[i].ssid, 68935e3dd157SKalle Valo arg->ssids[i].len); 68945e3dd157SKalle Valo } 68955e3dd157SKalle Valo 6896a6aa5da3SMichal Kazior ptr += sizeof(*ssids); 6897a6aa5da3SMichal Kazior ptr += sizeof(struct wmi_ssid) * arg->n_ssids; 68985e3dd157SKalle Valo } 68995e3dd157SKalle Valo 69005e3dd157SKalle Valo if (arg->n_bssids) { 6901a6aa5da3SMichal Kazior bssids = ptr; 69025e3dd157SKalle Valo bssids->tag = __cpu_to_le32(WMI_BSSID_LIST_TAG); 69035e3dd157SKalle Valo bssids->num_bssid = __cpu_to_le32(arg->n_bssids); 69045e3dd157SKalle Valo 69055e3dd157SKalle Valo for (i = 0; i < arg->n_bssids; i++) 69068f4ffb7dSKalle Valo ether_addr_copy(bssids->bssid_list[i].addr, 69078f4ffb7dSKalle Valo arg->bssids[i].bssid); 69085e3dd157SKalle Valo 6909a6aa5da3SMichal Kazior ptr += sizeof(*bssids); 6910a6aa5da3SMichal Kazior ptr += sizeof(struct wmi_mac_addr) * arg->n_bssids; 69115e3dd157SKalle Valo } 69125e3dd157SKalle Valo 69135e3dd157SKalle Valo if (arg->ie_len) { 6914a6aa5da3SMichal Kazior ie = ptr; 69155e3dd157SKalle Valo ie->tag = __cpu_to_le32(WMI_IE_TAG); 69165e3dd157SKalle Valo ie->ie_len = __cpu_to_le32(arg->ie_len); 69175e3dd157SKalle Valo memcpy(ie->ie_data, arg->ie, arg->ie_len); 69185e3dd157SKalle Valo 6919a6aa5da3SMichal Kazior ptr += sizeof(*ie); 6920a6aa5da3SMichal Kazior ptr += roundup(arg->ie_len, 4); 6921a6aa5da3SMichal Kazior } 69225e3dd157SKalle Valo } 69235e3dd157SKalle Valo 6924d7579d12SMichal Kazior static struct sk_buff * 6925d7579d12SMichal Kazior ath10k_wmi_op_gen_start_scan(struct ath10k *ar, 6926a6aa5da3SMichal Kazior const struct wmi_start_scan_arg *arg) 6927a6aa5da3SMichal Kazior { 6928d7579d12SMichal Kazior struct wmi_start_scan_cmd *cmd; 6929a6aa5da3SMichal Kazior struct sk_buff *skb; 6930a6aa5da3SMichal Kazior size_t len; 6931a6aa5da3SMichal Kazior int ret; 6932a6aa5da3SMichal Kazior 6933a6aa5da3SMichal Kazior ret = ath10k_wmi_start_scan_verify(arg); 6934a6aa5da3SMichal Kazior if (ret) 6935d7579d12SMichal Kazior return ERR_PTR(ret); 6936a6aa5da3SMichal Kazior 6937d7579d12SMichal Kazior len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg); 6938a6aa5da3SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 6939a6aa5da3SMichal Kazior if (!skb) 6940d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 6941a6aa5da3SMichal Kazior 6942a6aa5da3SMichal Kazior cmd = (struct wmi_start_scan_cmd *)skb->data; 6943a6aa5da3SMichal Kazior 6944a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_common(&cmd->common, arg); 6945a6aa5da3SMichal Kazior ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg); 6946d7579d12SMichal Kazior 6947d7579d12SMichal Kazior cmd->burst_duration_ms = __cpu_to_le32(0); 69485e3dd157SKalle Valo 69497aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n"); 6950d7579d12SMichal Kazior return skb; 6951d7579d12SMichal Kazior } 6952d7579d12SMichal Kazior 6953d7579d12SMichal Kazior static struct sk_buff * 6954d7579d12SMichal Kazior ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar, 6955d7579d12SMichal Kazior const struct wmi_start_scan_arg *arg) 6956d7579d12SMichal Kazior { 6957d7579d12SMichal Kazior struct wmi_10x_start_scan_cmd *cmd; 6958d7579d12SMichal Kazior struct sk_buff *skb; 6959d7579d12SMichal Kazior size_t len; 6960d7579d12SMichal Kazior int ret; 6961d7579d12SMichal Kazior 6962d7579d12SMichal Kazior ret = ath10k_wmi_start_scan_verify(arg); 6963d7579d12SMichal Kazior if (ret) 6964d7579d12SMichal Kazior return ERR_PTR(ret); 6965d7579d12SMichal Kazior 6966d7579d12SMichal Kazior len = sizeof(*cmd) + ath10k_wmi_start_scan_tlvs_len(arg); 6967d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 6968d7579d12SMichal Kazior if (!skb) 6969d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 6970d7579d12SMichal Kazior 6971d7579d12SMichal Kazior cmd = (struct wmi_10x_start_scan_cmd *)skb->data; 6972d7579d12SMichal Kazior 6973d7579d12SMichal Kazior ath10k_wmi_put_start_scan_common(&cmd->common, arg); 6974d7579d12SMichal Kazior ath10k_wmi_put_start_scan_tlvs(&cmd->tlvs, arg); 6975d7579d12SMichal Kazior 6976d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n"); 6977d7579d12SMichal Kazior return skb; 69785e3dd157SKalle Valo } 69795e3dd157SKalle Valo 69805e3dd157SKalle Valo void ath10k_wmi_start_scan_init(struct ath10k *ar, 69815e3dd157SKalle Valo struct wmi_start_scan_arg *arg) 69825e3dd157SKalle Valo { 69835e3dd157SKalle Valo /* setup commonly used values */ 69845e3dd157SKalle Valo arg->scan_req_id = 1; 69855e3dd157SKalle Valo arg->scan_priority = WMI_SCAN_PRIORITY_LOW; 69865e3dd157SKalle Valo arg->dwell_time_active = 50; 69875e3dd157SKalle Valo arg->dwell_time_passive = 150; 69885e3dd157SKalle Valo arg->min_rest_time = 50; 69895e3dd157SKalle Valo arg->max_rest_time = 500; 69905e3dd157SKalle Valo arg->repeat_probe_time = 0; 69915e3dd157SKalle Valo arg->probe_spacing_time = 0; 69925e3dd157SKalle Valo arg->idle_time = 0; 6993c322892fSBartosz Markowski arg->max_scan_time = 20000; 69945e3dd157SKalle Valo arg->probe_delay = 5; 69955e3dd157SKalle Valo arg->notify_scan_events = WMI_SCAN_EVENT_STARTED 69965e3dd157SKalle Valo | WMI_SCAN_EVENT_COMPLETED 69975e3dd157SKalle Valo | WMI_SCAN_EVENT_BSS_CHANNEL 69985e3dd157SKalle Valo | WMI_SCAN_EVENT_FOREIGN_CHANNEL 6999ebee76f7SBenjamin Berg | WMI_SCAN_EVENT_FOREIGN_CHANNEL_EXIT 70005e3dd157SKalle Valo | WMI_SCAN_EVENT_DEQUEUED; 70015e3dd157SKalle Valo arg->scan_ctrl_flags |= WMI_SCAN_CHAN_STAT_EVENT; 70025e3dd157SKalle Valo arg->n_bssids = 1; 70035e3dd157SKalle Valo arg->bssids[0].bssid = "\xFF\xFF\xFF\xFF\xFF\xFF"; 70045e3dd157SKalle Valo } 70055e3dd157SKalle Valo 7006d7579d12SMichal Kazior static struct sk_buff * 7007d7579d12SMichal Kazior ath10k_wmi_op_gen_stop_scan(struct ath10k *ar, 7008d7579d12SMichal Kazior const struct wmi_stop_scan_arg *arg) 70095e3dd157SKalle Valo { 70105e3dd157SKalle Valo struct wmi_stop_scan_cmd *cmd; 70115e3dd157SKalle Valo struct sk_buff *skb; 70125e3dd157SKalle Valo u32 scan_id; 70135e3dd157SKalle Valo u32 req_id; 70145e3dd157SKalle Valo 70155e3dd157SKalle Valo if (arg->req_id > 0xFFF) 7016d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 70175e3dd157SKalle Valo if (arg->req_type == WMI_SCAN_STOP_ONE && arg->u.scan_id > 0xFFF) 7018d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 70195e3dd157SKalle Valo 70207aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 70215e3dd157SKalle Valo if (!skb) 7022d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 70235e3dd157SKalle Valo 70245e3dd157SKalle Valo scan_id = arg->u.scan_id; 70255e3dd157SKalle Valo scan_id |= WMI_HOST_SCAN_REQ_ID_PREFIX; 70265e3dd157SKalle Valo 70275e3dd157SKalle Valo req_id = arg->req_id; 70285e3dd157SKalle Valo req_id |= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX; 70295e3dd157SKalle Valo 70305e3dd157SKalle Valo cmd = (struct wmi_stop_scan_cmd *)skb->data; 70315e3dd157SKalle Valo cmd->req_type = __cpu_to_le32(arg->req_type); 70325e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->u.vdev_id); 70335e3dd157SKalle Valo cmd->scan_id = __cpu_to_le32(scan_id); 70345e3dd157SKalle Valo cmd->scan_req_id = __cpu_to_le32(req_id); 70355e3dd157SKalle Valo 70367aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 70375e3dd157SKalle Valo "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n", 70385e3dd157SKalle Valo arg->req_id, arg->req_type, arg->u.scan_id); 7039d7579d12SMichal Kazior return skb; 70405e3dd157SKalle Valo } 70415e3dd157SKalle Valo 7042d7579d12SMichal Kazior static struct sk_buff * 7043d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id, 70445e3dd157SKalle Valo enum wmi_vdev_type type, 70455e3dd157SKalle Valo enum wmi_vdev_subtype subtype, 70465e3dd157SKalle Valo const u8 macaddr[ETH_ALEN]) 70475e3dd157SKalle Valo { 70485e3dd157SKalle Valo struct wmi_vdev_create_cmd *cmd; 70495e3dd157SKalle Valo struct sk_buff *skb; 70505e3dd157SKalle Valo 70517aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 70525e3dd157SKalle Valo if (!skb) 7053d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 70545e3dd157SKalle Valo 70555e3dd157SKalle Valo cmd = (struct wmi_vdev_create_cmd *)skb->data; 70565e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 70575e3dd157SKalle Valo cmd->vdev_type = __cpu_to_le32(type); 70585e3dd157SKalle Valo cmd->vdev_subtype = __cpu_to_le32(subtype); 7059b25f32cbSKalle Valo ether_addr_copy(cmd->vdev_macaddr.addr, macaddr); 70605e3dd157SKalle Valo 70617aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 70625e3dd157SKalle Valo "WMI vdev create: id %d type %d subtype %d macaddr %pM\n", 70635e3dd157SKalle Valo vdev_id, type, subtype, macaddr); 7064d7579d12SMichal Kazior return skb; 70655e3dd157SKalle Valo } 70665e3dd157SKalle Valo 7067d7579d12SMichal Kazior static struct sk_buff * 7068d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id) 70695e3dd157SKalle Valo { 70705e3dd157SKalle Valo struct wmi_vdev_delete_cmd *cmd; 70715e3dd157SKalle Valo struct sk_buff *skb; 70725e3dd157SKalle Valo 70737aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 70745e3dd157SKalle Valo if (!skb) 7075d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 70765e3dd157SKalle Valo 70775e3dd157SKalle Valo cmd = (struct wmi_vdev_delete_cmd *)skb->data; 70785e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 70795e3dd157SKalle Valo 70807aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 70815e3dd157SKalle Valo "WMI vdev delete id %d\n", vdev_id); 7082d7579d12SMichal Kazior return skb; 70835e3dd157SKalle Valo } 70845e3dd157SKalle Valo 7085d7579d12SMichal Kazior static struct sk_buff * 7086d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_start(struct ath10k *ar, 70875e3dd157SKalle Valo const struct wmi_vdev_start_request_arg *arg, 7088d7579d12SMichal Kazior bool restart) 70895e3dd157SKalle Valo { 70905e3dd157SKalle Valo struct wmi_vdev_start_request_cmd *cmd; 70915e3dd157SKalle Valo struct sk_buff *skb; 70925e3dd157SKalle Valo const char *cmdname; 70935e3dd157SKalle Valo u32 flags = 0; 70945e3dd157SKalle Valo 70955e3dd157SKalle Valo if (WARN_ON(arg->hidden_ssid && !arg->ssid)) 7096d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 70975e3dd157SKalle Valo if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid))) 7098d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 70995e3dd157SKalle Valo 7100d7579d12SMichal Kazior if (restart) 71015e3dd157SKalle Valo cmdname = "restart"; 71025e3dd157SKalle Valo else 7103d7579d12SMichal Kazior cmdname = "start"; 71045e3dd157SKalle Valo 71057aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 71065e3dd157SKalle Valo if (!skb) 7107d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 71085e3dd157SKalle Valo 71095e3dd157SKalle Valo if (arg->hidden_ssid) 71105e3dd157SKalle Valo flags |= WMI_VDEV_START_HIDDEN_SSID; 71115e3dd157SKalle Valo if (arg->pmf_enabled) 71125e3dd157SKalle Valo flags |= WMI_VDEV_START_PMF_ENABLED; 71135e3dd157SKalle Valo 71145e3dd157SKalle Valo cmd = (struct wmi_vdev_start_request_cmd *)skb->data; 71155e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 71165e3dd157SKalle Valo cmd->disable_hw_ack = __cpu_to_le32(arg->disable_hw_ack); 71175e3dd157SKalle Valo cmd->beacon_interval = __cpu_to_le32(arg->bcn_intval); 71185e3dd157SKalle Valo cmd->dtim_period = __cpu_to_le32(arg->dtim_period); 71195e3dd157SKalle Valo cmd->flags = __cpu_to_le32(flags); 71205e3dd157SKalle Valo cmd->bcn_tx_rate = __cpu_to_le32(arg->bcn_tx_rate); 71215e3dd157SKalle Valo cmd->bcn_tx_power = __cpu_to_le32(arg->bcn_tx_power); 71225e3dd157SKalle Valo 71235e3dd157SKalle Valo if (arg->ssid) { 71245e3dd157SKalle Valo cmd->ssid.ssid_len = __cpu_to_le32(arg->ssid_len); 71255e3dd157SKalle Valo memcpy(cmd->ssid.ssid, arg->ssid, arg->ssid_len); 71265e3dd157SKalle Valo } 71275e3dd157SKalle Valo 71282d66721cSMichal Kazior ath10k_wmi_put_wmi_channel(&cmd->chan, &arg->channel); 71295e3dd157SKalle Valo 71307aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 71318cc7f26cSKalle Valo "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n", 71328cc7f26cSKalle Valo cmdname, arg->vdev_id, 7133e8a50f8bSMarek Puzyniak flags, arg->channel.freq, arg->channel.mode, 7134e8a50f8bSMarek Puzyniak cmd->chan.flags, arg->channel.max_power); 71355e3dd157SKalle Valo 7136d7579d12SMichal Kazior return skb; 71375e3dd157SKalle Valo } 71385e3dd157SKalle Valo 7139d7579d12SMichal Kazior static struct sk_buff * 7140d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id) 71415e3dd157SKalle Valo { 71425e3dd157SKalle Valo struct wmi_vdev_stop_cmd *cmd; 71435e3dd157SKalle Valo struct sk_buff *skb; 71445e3dd157SKalle Valo 71457aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 71465e3dd157SKalle Valo if (!skb) 7147d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 71485e3dd157SKalle Valo 71495e3dd157SKalle Valo cmd = (struct wmi_vdev_stop_cmd *)skb->data; 71505e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 71515e3dd157SKalle Valo 71527aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id); 7153d7579d12SMichal Kazior return skb; 71545e3dd157SKalle Valo } 71555e3dd157SKalle Valo 7156d7579d12SMichal Kazior static struct sk_buff * 7157d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, 7158d7579d12SMichal Kazior const u8 *bssid) 71595e3dd157SKalle Valo { 71605e3dd157SKalle Valo struct wmi_vdev_up_cmd *cmd; 71615e3dd157SKalle Valo struct sk_buff *skb; 71625e3dd157SKalle Valo 71637aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 71645e3dd157SKalle Valo if (!skb) 7165d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 71665e3dd157SKalle Valo 71675e3dd157SKalle Valo cmd = (struct wmi_vdev_up_cmd *)skb->data; 71685e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 71695e3dd157SKalle Valo cmd->vdev_assoc_id = __cpu_to_le32(aid); 7170b25f32cbSKalle Valo ether_addr_copy(cmd->vdev_bssid.addr, bssid); 71715e3dd157SKalle Valo 71727aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 71735e3dd157SKalle Valo "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n", 71745e3dd157SKalle Valo vdev_id, aid, bssid); 7175d7579d12SMichal Kazior return skb; 71765e3dd157SKalle Valo } 71775e3dd157SKalle Valo 7178d7579d12SMichal Kazior static struct sk_buff * 7179d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id) 71805e3dd157SKalle Valo { 71815e3dd157SKalle Valo struct wmi_vdev_down_cmd *cmd; 71825e3dd157SKalle Valo struct sk_buff *skb; 71835e3dd157SKalle Valo 71847aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 71855e3dd157SKalle Valo if (!skb) 7186d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 71875e3dd157SKalle Valo 71885e3dd157SKalle Valo cmd = (struct wmi_vdev_down_cmd *)skb->data; 71895e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 71905e3dd157SKalle Valo 71917aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 71925e3dd157SKalle Valo "wmi mgmt vdev down id 0x%x\n", vdev_id); 7193d7579d12SMichal Kazior return skb; 71945e3dd157SKalle Valo } 71955e3dd157SKalle Valo 7196d7579d12SMichal Kazior static struct sk_buff * 7197d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id, 71986d1506e7SBartosz Markowski u32 param_id, u32 param_value) 71995e3dd157SKalle Valo { 72005e3dd157SKalle Valo struct wmi_vdev_set_param_cmd *cmd; 72015e3dd157SKalle Valo struct sk_buff *skb; 72025e3dd157SKalle Valo 72036d1506e7SBartosz Markowski if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) { 72047aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 72056d1506e7SBartosz Markowski "vdev param %d not supported by firmware\n", 72066d1506e7SBartosz Markowski param_id); 7207d7579d12SMichal Kazior return ERR_PTR(-EOPNOTSUPP); 72086d1506e7SBartosz Markowski } 72096d1506e7SBartosz Markowski 72107aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 72115e3dd157SKalle Valo if (!skb) 7212d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 72135e3dd157SKalle Valo 72145e3dd157SKalle Valo cmd = (struct wmi_vdev_set_param_cmd *)skb->data; 72155e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 72165e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 72175e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(param_value); 72185e3dd157SKalle Valo 72197aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 72205e3dd157SKalle Valo "wmi vdev id 0x%x set param %d value %d\n", 72215e3dd157SKalle Valo vdev_id, param_id, param_value); 7222d7579d12SMichal Kazior return skb; 72235e3dd157SKalle Valo } 72245e3dd157SKalle Valo 7225d7579d12SMichal Kazior static struct sk_buff * 7226d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar, 72275e3dd157SKalle Valo const struct wmi_vdev_install_key_arg *arg) 72285e3dd157SKalle Valo { 72295e3dd157SKalle Valo struct wmi_vdev_install_key_cmd *cmd; 72305e3dd157SKalle Valo struct sk_buff *skb; 72315e3dd157SKalle Valo 72325e3dd157SKalle Valo if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL) 7233d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 72345e3dd157SKalle Valo if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL) 7235d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 72365e3dd157SKalle Valo 72377aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len); 72385e3dd157SKalle Valo if (!skb) 7239d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 72405e3dd157SKalle Valo 72415e3dd157SKalle Valo cmd = (struct wmi_vdev_install_key_cmd *)skb->data; 72425e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 72435e3dd157SKalle Valo cmd->key_idx = __cpu_to_le32(arg->key_idx); 72445e3dd157SKalle Valo cmd->key_flags = __cpu_to_le32(arg->key_flags); 72455e3dd157SKalle Valo cmd->key_cipher = __cpu_to_le32(arg->key_cipher); 72465e3dd157SKalle Valo cmd->key_len = __cpu_to_le32(arg->key_len); 72475e3dd157SKalle Valo cmd->key_txmic_len = __cpu_to_le32(arg->key_txmic_len); 72485e3dd157SKalle Valo cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len); 72495e3dd157SKalle Valo 72505e3dd157SKalle Valo if (arg->macaddr) 7251b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr); 72525e3dd157SKalle Valo if (arg->key_data) 72535e3dd157SKalle Valo memcpy(cmd->key_data, arg->key_data, arg->key_len); 72545e3dd157SKalle Valo 72557aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 7256e0c508abSMichal Kazior "wmi vdev install key idx %d cipher %d len %d\n", 7257e0c508abSMichal Kazior arg->key_idx, arg->key_cipher, arg->key_len); 7258d7579d12SMichal Kazior return skb; 72595e3dd157SKalle Valo } 72605e3dd157SKalle Valo 7261d7579d12SMichal Kazior static struct sk_buff * 7262d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar, 7263855aed12SSimon Wunderlich const struct wmi_vdev_spectral_conf_arg *arg) 7264855aed12SSimon Wunderlich { 7265855aed12SSimon Wunderlich struct wmi_vdev_spectral_conf_cmd *cmd; 7266855aed12SSimon Wunderlich struct sk_buff *skb; 7267855aed12SSimon Wunderlich 72687aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7269855aed12SSimon Wunderlich if (!skb) 7270d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 7271855aed12SSimon Wunderlich 7272855aed12SSimon Wunderlich cmd = (struct wmi_vdev_spectral_conf_cmd *)skb->data; 7273855aed12SSimon Wunderlich cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 7274855aed12SSimon Wunderlich cmd->scan_count = __cpu_to_le32(arg->scan_count); 7275855aed12SSimon Wunderlich cmd->scan_period = __cpu_to_le32(arg->scan_period); 7276855aed12SSimon Wunderlich cmd->scan_priority = __cpu_to_le32(arg->scan_priority); 7277855aed12SSimon Wunderlich cmd->scan_fft_size = __cpu_to_le32(arg->scan_fft_size); 7278855aed12SSimon Wunderlich cmd->scan_gc_ena = __cpu_to_le32(arg->scan_gc_ena); 7279855aed12SSimon Wunderlich cmd->scan_restart_ena = __cpu_to_le32(arg->scan_restart_ena); 7280855aed12SSimon Wunderlich cmd->scan_noise_floor_ref = __cpu_to_le32(arg->scan_noise_floor_ref); 7281855aed12SSimon Wunderlich cmd->scan_init_delay = __cpu_to_le32(arg->scan_init_delay); 7282855aed12SSimon Wunderlich cmd->scan_nb_tone_thr = __cpu_to_le32(arg->scan_nb_tone_thr); 7283855aed12SSimon Wunderlich cmd->scan_str_bin_thr = __cpu_to_le32(arg->scan_str_bin_thr); 7284855aed12SSimon Wunderlich cmd->scan_wb_rpt_mode = __cpu_to_le32(arg->scan_wb_rpt_mode); 7285855aed12SSimon Wunderlich cmd->scan_rssi_rpt_mode = __cpu_to_le32(arg->scan_rssi_rpt_mode); 7286855aed12SSimon Wunderlich cmd->scan_rssi_thr = __cpu_to_le32(arg->scan_rssi_thr); 7287855aed12SSimon Wunderlich cmd->scan_pwr_format = __cpu_to_le32(arg->scan_pwr_format); 7288855aed12SSimon Wunderlich cmd->scan_rpt_mode = __cpu_to_le32(arg->scan_rpt_mode); 7289855aed12SSimon Wunderlich cmd->scan_bin_scale = __cpu_to_le32(arg->scan_bin_scale); 7290855aed12SSimon Wunderlich cmd->scan_dbm_adj = __cpu_to_le32(arg->scan_dbm_adj); 7291855aed12SSimon Wunderlich cmd->scan_chn_mask = __cpu_to_le32(arg->scan_chn_mask); 7292855aed12SSimon Wunderlich 7293d7579d12SMichal Kazior return skb; 7294855aed12SSimon Wunderlich } 7295855aed12SSimon Wunderlich 7296d7579d12SMichal Kazior static struct sk_buff * 7297d7579d12SMichal Kazior ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, 7298d7579d12SMichal Kazior u32 trigger, u32 enable) 7299855aed12SSimon Wunderlich { 7300855aed12SSimon Wunderlich struct wmi_vdev_spectral_enable_cmd *cmd; 7301855aed12SSimon Wunderlich struct sk_buff *skb; 7302855aed12SSimon Wunderlich 73037aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7304855aed12SSimon Wunderlich if (!skb) 7305d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 7306855aed12SSimon Wunderlich 7307855aed12SSimon Wunderlich cmd = (struct wmi_vdev_spectral_enable_cmd *)skb->data; 7308855aed12SSimon Wunderlich cmd->vdev_id = __cpu_to_le32(vdev_id); 7309855aed12SSimon Wunderlich cmd->trigger_cmd = __cpu_to_le32(trigger); 7310855aed12SSimon Wunderlich cmd->enable_cmd = __cpu_to_le32(enable); 7311855aed12SSimon Wunderlich 7312d7579d12SMichal Kazior return skb; 7313855aed12SSimon Wunderlich } 7314855aed12SSimon Wunderlich 7315d7579d12SMichal Kazior static struct sk_buff * 7316d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id, 73177390ed34SMarek Puzyniak const u8 peer_addr[ETH_ALEN], 73187390ed34SMarek Puzyniak enum wmi_peer_type peer_type) 73195e3dd157SKalle Valo { 73205e3dd157SKalle Valo struct wmi_peer_create_cmd *cmd; 73215e3dd157SKalle Valo struct sk_buff *skb; 73225e3dd157SKalle Valo 73237aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 73245e3dd157SKalle Valo if (!skb) 7325d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 73265e3dd157SKalle Valo 73275e3dd157SKalle Valo cmd = (struct wmi_peer_create_cmd *)skb->data; 73285e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 7329b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 7330be5b4f40SManikanta Pubbisetty cmd->peer_type = __cpu_to_le32(peer_type); 73315e3dd157SKalle Valo 73327aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 73335e3dd157SKalle Valo "wmi peer create vdev_id %d peer_addr %pM\n", 73345e3dd157SKalle Valo vdev_id, peer_addr); 7335d7579d12SMichal Kazior return skb; 73365e3dd157SKalle Valo } 73375e3dd157SKalle Valo 7338d7579d12SMichal Kazior static struct sk_buff * 7339d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id, 73405e3dd157SKalle Valo const u8 peer_addr[ETH_ALEN]) 73415e3dd157SKalle Valo { 73425e3dd157SKalle Valo struct wmi_peer_delete_cmd *cmd; 73435e3dd157SKalle Valo struct sk_buff *skb; 73445e3dd157SKalle Valo 73457aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 73465e3dd157SKalle Valo if (!skb) 7347d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 73485e3dd157SKalle Valo 73495e3dd157SKalle Valo cmd = (struct wmi_peer_delete_cmd *)skb->data; 73505e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 7351b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 73525e3dd157SKalle Valo 73537aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 73545e3dd157SKalle Valo "wmi peer delete vdev_id %d peer_addr %pM\n", 73555e3dd157SKalle Valo vdev_id, peer_addr); 7356d7579d12SMichal Kazior return skb; 73575e3dd157SKalle Valo } 73585e3dd157SKalle Valo 7359d7579d12SMichal Kazior static struct sk_buff * 7360d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id, 73615e3dd157SKalle Valo const u8 peer_addr[ETH_ALEN], u32 tid_bitmap) 73625e3dd157SKalle Valo { 73635e3dd157SKalle Valo struct wmi_peer_flush_tids_cmd *cmd; 73645e3dd157SKalle Valo struct sk_buff *skb; 73655e3dd157SKalle Valo 73667aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 73675e3dd157SKalle Valo if (!skb) 7368d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 73695e3dd157SKalle Valo 73705e3dd157SKalle Valo cmd = (struct wmi_peer_flush_tids_cmd *)skb->data; 73715e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 73725e3dd157SKalle Valo cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap); 7373b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 73745e3dd157SKalle Valo 73757aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 73765e3dd157SKalle Valo "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n", 73775e3dd157SKalle Valo vdev_id, peer_addr, tid_bitmap); 7378d7579d12SMichal Kazior return skb; 73795e3dd157SKalle Valo } 73805e3dd157SKalle Valo 7381d7579d12SMichal Kazior static struct sk_buff * 7382d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id, 7383d7579d12SMichal Kazior const u8 *peer_addr, 7384d7579d12SMichal Kazior enum wmi_peer_param param_id, 73855e3dd157SKalle Valo u32 param_value) 73865e3dd157SKalle Valo { 73875e3dd157SKalle Valo struct wmi_peer_set_param_cmd *cmd; 73885e3dd157SKalle Valo struct sk_buff *skb; 73895e3dd157SKalle Valo 73907aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 73915e3dd157SKalle Valo if (!skb) 7392d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 73935e3dd157SKalle Valo 73945e3dd157SKalle Valo cmd = (struct wmi_peer_set_param_cmd *)skb->data; 73955e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 73965e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 73975e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(param_value); 7398b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, peer_addr); 73995e3dd157SKalle Valo 74007aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 74015e3dd157SKalle Valo "wmi vdev %d peer 0x%pM set param %d value %d\n", 74025e3dd157SKalle Valo vdev_id, peer_addr, param_id, param_value); 7403d7579d12SMichal Kazior return skb; 74045e3dd157SKalle Valo } 74055e3dd157SKalle Valo 7406d7579d12SMichal Kazior static struct sk_buff * 7407d7579d12SMichal Kazior ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id, 74085e3dd157SKalle Valo enum wmi_sta_ps_mode psmode) 74095e3dd157SKalle Valo { 74105e3dd157SKalle Valo struct wmi_sta_powersave_mode_cmd *cmd; 74115e3dd157SKalle Valo struct sk_buff *skb; 74125e3dd157SKalle Valo 74137aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 74145e3dd157SKalle Valo if (!skb) 7415d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 74165e3dd157SKalle Valo 74175e3dd157SKalle Valo cmd = (struct wmi_sta_powersave_mode_cmd *)skb->data; 74185e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 74195e3dd157SKalle Valo cmd->sta_ps_mode = __cpu_to_le32(psmode); 74205e3dd157SKalle Valo 74217aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 74225e3dd157SKalle Valo "wmi set powersave id 0x%x mode %d\n", 74235e3dd157SKalle Valo vdev_id, psmode); 7424d7579d12SMichal Kazior return skb; 74255e3dd157SKalle Valo } 74265e3dd157SKalle Valo 7427d7579d12SMichal Kazior static struct sk_buff * 7428d7579d12SMichal Kazior ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id, 74295e3dd157SKalle Valo enum wmi_sta_powersave_param param_id, 74305e3dd157SKalle Valo u32 value) 74315e3dd157SKalle Valo { 74325e3dd157SKalle Valo struct wmi_sta_powersave_param_cmd *cmd; 74335e3dd157SKalle Valo struct sk_buff *skb; 74345e3dd157SKalle Valo 74357aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 74365e3dd157SKalle Valo if (!skb) 7437d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 74385e3dd157SKalle Valo 74395e3dd157SKalle Valo cmd = (struct wmi_sta_powersave_param_cmd *)skb->data; 74405e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 74415e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 74425e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(value); 74435e3dd157SKalle Valo 74447aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 74455e3dd157SKalle Valo "wmi sta ps param vdev_id 0x%x param %d value %d\n", 74465e3dd157SKalle Valo vdev_id, param_id, value); 7447d7579d12SMichal Kazior return skb; 74485e3dd157SKalle Valo } 74495e3dd157SKalle Valo 7450d7579d12SMichal Kazior static struct sk_buff * 7451d7579d12SMichal Kazior ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac, 74525e3dd157SKalle Valo enum wmi_ap_ps_peer_param param_id, u32 value) 74535e3dd157SKalle Valo { 74545e3dd157SKalle Valo struct wmi_ap_ps_peer_cmd *cmd; 74555e3dd157SKalle Valo struct sk_buff *skb; 74565e3dd157SKalle Valo 74575e3dd157SKalle Valo if (!mac) 7458d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 74595e3dd157SKalle Valo 74607aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 74615e3dd157SKalle Valo if (!skb) 7462d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 74635e3dd157SKalle Valo 74645e3dd157SKalle Valo cmd = (struct wmi_ap_ps_peer_cmd *)skb->data; 74655e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(vdev_id); 74665e3dd157SKalle Valo cmd->param_id = __cpu_to_le32(param_id); 74675e3dd157SKalle Valo cmd->param_value = __cpu_to_le32(value); 7468b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, mac); 74695e3dd157SKalle Valo 74707aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 74715e3dd157SKalle Valo "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n", 74725e3dd157SKalle Valo vdev_id, param_id, value, mac); 7473d7579d12SMichal Kazior return skb; 74745e3dd157SKalle Valo } 74755e3dd157SKalle Valo 7476d7579d12SMichal Kazior static struct sk_buff * 7477d7579d12SMichal Kazior ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar, 74785e3dd157SKalle Valo const struct wmi_scan_chan_list_arg *arg) 74795e3dd157SKalle Valo { 74805e3dd157SKalle Valo struct wmi_scan_chan_list_cmd *cmd; 74815e3dd157SKalle Valo struct sk_buff *skb; 74825e3dd157SKalle Valo struct wmi_channel_arg *ch; 74835e3dd157SKalle Valo struct wmi_channel *ci; 74845e3dd157SKalle Valo int len; 74855e3dd157SKalle Valo int i; 74865e3dd157SKalle Valo 74875e3dd157SKalle Valo len = sizeof(*cmd) + arg->n_channels * sizeof(struct wmi_channel); 74885e3dd157SKalle Valo 74897aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 74905e3dd157SKalle Valo if (!skb) 7491d7579d12SMichal Kazior return ERR_PTR(-EINVAL); 74925e3dd157SKalle Valo 74935e3dd157SKalle Valo cmd = (struct wmi_scan_chan_list_cmd *)skb->data; 74945e3dd157SKalle Valo cmd->num_scan_chans = __cpu_to_le32(arg->n_channels); 74955e3dd157SKalle Valo 74965e3dd157SKalle Valo for (i = 0; i < arg->n_channels; i++) { 74975e3dd157SKalle Valo ch = &arg->channels[i]; 74985e3dd157SKalle Valo ci = &cmd->chan_info[i]; 74995e3dd157SKalle Valo 75002d66721cSMichal Kazior ath10k_wmi_put_wmi_channel(ci, ch); 75015e3dd157SKalle Valo } 75025e3dd157SKalle Valo 7503d7579d12SMichal Kazior return skb; 75045e3dd157SKalle Valo } 75055e3dd157SKalle Valo 750624c88f78SMichal Kazior static void 750724c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf, 75085e3dd157SKalle Valo const struct wmi_peer_assoc_complete_arg *arg) 75095e3dd157SKalle Valo { 751024c88f78SMichal Kazior struct wmi_common_peer_assoc_complete_cmd *cmd = buf; 75115e3dd157SKalle Valo 75125e3dd157SKalle Valo cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 75135e3dd157SKalle Valo cmd->peer_new_assoc = __cpu_to_le32(arg->peer_reassoc ? 0 : 1); 75145e3dd157SKalle Valo cmd->peer_associd = __cpu_to_le32(arg->peer_aid); 75155e3dd157SKalle Valo cmd->peer_flags = __cpu_to_le32(arg->peer_flags); 75165e3dd157SKalle Valo cmd->peer_caps = __cpu_to_le32(arg->peer_caps); 75175e3dd157SKalle Valo cmd->peer_listen_intval = __cpu_to_le32(arg->peer_listen_intval); 75185e3dd157SKalle Valo cmd->peer_ht_caps = __cpu_to_le32(arg->peer_ht_caps); 75195e3dd157SKalle Valo cmd->peer_max_mpdu = __cpu_to_le32(arg->peer_max_mpdu); 75205e3dd157SKalle Valo cmd->peer_mpdu_density = __cpu_to_le32(arg->peer_mpdu_density); 75215e3dd157SKalle Valo cmd->peer_rate_caps = __cpu_to_le32(arg->peer_rate_caps); 75225e3dd157SKalle Valo cmd->peer_nss = __cpu_to_le32(arg->peer_num_spatial_streams); 75235e3dd157SKalle Valo cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps); 75245e3dd157SKalle Valo cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode); 75255e3dd157SKalle Valo 7526b25f32cbSKalle Valo ether_addr_copy(cmd->peer_macaddr.addr, arg->addr); 75275e3dd157SKalle Valo 75285e3dd157SKalle Valo cmd->peer_legacy_rates.num_rates = 75295e3dd157SKalle Valo __cpu_to_le32(arg->peer_legacy_rates.num_rates); 75305e3dd157SKalle Valo memcpy(cmd->peer_legacy_rates.rates, arg->peer_legacy_rates.rates, 75315e3dd157SKalle Valo arg->peer_legacy_rates.num_rates); 75325e3dd157SKalle Valo 75335e3dd157SKalle Valo cmd->peer_ht_rates.num_rates = 75345e3dd157SKalle Valo __cpu_to_le32(arg->peer_ht_rates.num_rates); 75355e3dd157SKalle Valo memcpy(cmd->peer_ht_rates.rates, arg->peer_ht_rates.rates, 75365e3dd157SKalle Valo arg->peer_ht_rates.num_rates); 75375e3dd157SKalle Valo 75385e3dd157SKalle Valo cmd->peer_vht_rates.rx_max_rate = 75395e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.rx_max_rate); 75405e3dd157SKalle Valo cmd->peer_vht_rates.rx_mcs_set = 75415e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.rx_mcs_set); 75425e3dd157SKalle Valo cmd->peer_vht_rates.tx_max_rate = 75435e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.tx_max_rate); 75445e3dd157SKalle Valo cmd->peer_vht_rates.tx_mcs_set = 75455e3dd157SKalle Valo __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set); 754624c88f78SMichal Kazior } 754724c88f78SMichal Kazior 754824c88f78SMichal Kazior static void 754924c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf, 755024c88f78SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 755124c88f78SMichal Kazior { 755224c88f78SMichal Kazior struct wmi_main_peer_assoc_complete_cmd *cmd = buf; 755324c88f78SMichal Kazior 755424c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(ar, buf, arg); 755524c88f78SMichal Kazior memset(cmd->peer_ht_info, 0, sizeof(cmd->peer_ht_info)); 755624c88f78SMichal Kazior } 755724c88f78SMichal Kazior 755824c88f78SMichal Kazior static void 755924c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf, 756024c88f78SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 756124c88f78SMichal Kazior { 756224c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(ar, buf, arg); 756324c88f78SMichal Kazior } 756424c88f78SMichal Kazior 756524c88f78SMichal Kazior static void 756624c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf, 756724c88f78SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 756824c88f78SMichal Kazior { 756924c88f78SMichal Kazior struct wmi_10_2_peer_assoc_complete_cmd *cmd = buf; 757024c88f78SMichal Kazior int max_mcs, max_nss; 757124c88f78SMichal Kazior u32 info0; 757224c88f78SMichal Kazior 757324c88f78SMichal Kazior /* TODO: Is using max values okay with firmware? */ 757424c88f78SMichal Kazior max_mcs = 0xf; 757524c88f78SMichal Kazior max_nss = 0xf; 757624c88f78SMichal Kazior 757724c88f78SMichal Kazior info0 = SM(max_mcs, WMI_PEER_ASSOC_INFO0_MAX_MCS_IDX) | 757824c88f78SMichal Kazior SM(max_nss, WMI_PEER_ASSOC_INFO0_MAX_NSS); 757924c88f78SMichal Kazior 758024c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill(ar, buf, arg); 758124c88f78SMichal Kazior cmd->info0 = __cpu_to_le32(info0); 758224c88f78SMichal Kazior } 758324c88f78SMichal Kazior 7584b54e16f1SVasanthakumar Thiagarajan static void 7585b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf, 7586b54e16f1SVasanthakumar Thiagarajan const struct wmi_peer_assoc_complete_arg *arg) 7587b54e16f1SVasanthakumar Thiagarajan { 7588b54e16f1SVasanthakumar Thiagarajan struct wmi_10_4_peer_assoc_complete_cmd *cmd = buf; 7589b54e16f1SVasanthakumar Thiagarajan 7590b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg); 7591cc914a55SBen Greear if (arg->peer_bw_rxnss_override) 7592cc914a55SBen Greear cmd->peer_bw_rxnss_override = 7593cc914a55SBen Greear __cpu_to_le32((arg->peer_bw_rxnss_override - 1) | 7594cc914a55SBen Greear BIT(PEER_BW_RXNSS_OVERRIDE_OFFSET)); 7595cc914a55SBen Greear else 7596b54e16f1SVasanthakumar Thiagarajan cmd->peer_bw_rxnss_override = 0; 7597b54e16f1SVasanthakumar Thiagarajan } 7598b54e16f1SVasanthakumar Thiagarajan 7599d7579d12SMichal Kazior static int 7600d7579d12SMichal Kazior ath10k_wmi_peer_assoc_check_arg(const struct wmi_peer_assoc_complete_arg *arg) 760124c88f78SMichal Kazior { 760224c88f78SMichal Kazior if (arg->peer_mpdu_density > 16) 760324c88f78SMichal Kazior return -EINVAL; 760424c88f78SMichal Kazior if (arg->peer_legacy_rates.num_rates > MAX_SUPPORTED_RATES) 760524c88f78SMichal Kazior return -EINVAL; 760624c88f78SMichal Kazior if (arg->peer_ht_rates.num_rates > MAX_SUPPORTED_RATES) 760724c88f78SMichal Kazior return -EINVAL; 760824c88f78SMichal Kazior 7609d7579d12SMichal Kazior return 0; 761024c88f78SMichal Kazior } 761124c88f78SMichal Kazior 7612d7579d12SMichal Kazior static struct sk_buff * 7613d7579d12SMichal Kazior ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar, 7614d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 7615d7579d12SMichal Kazior { 7616d7579d12SMichal Kazior size_t len = sizeof(struct wmi_main_peer_assoc_complete_cmd); 7617d7579d12SMichal Kazior struct sk_buff *skb; 7618d7579d12SMichal Kazior int ret; 7619d7579d12SMichal Kazior 7620d7579d12SMichal Kazior ret = ath10k_wmi_peer_assoc_check_arg(arg); 7621d7579d12SMichal Kazior if (ret) 7622d7579d12SMichal Kazior return ERR_PTR(ret); 7623d7579d12SMichal Kazior 76247aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 762524c88f78SMichal Kazior if (!skb) 7626d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 762724c88f78SMichal Kazior 762824c88f78SMichal Kazior ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg); 76295e3dd157SKalle Valo 76307aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 763144d6fa90SChun-Yeow Yeoh "wmi peer assoc vdev %d addr %pM (%s)\n", 763244d6fa90SChun-Yeow Yeoh arg->vdev_id, arg->addr, 763344d6fa90SChun-Yeow Yeoh arg->peer_reassoc ? "reassociate" : "new"); 7634d7579d12SMichal Kazior return skb; 7635d7579d12SMichal Kazior } 7636d7579d12SMichal Kazior 7637d7579d12SMichal Kazior static struct sk_buff * 7638d7579d12SMichal Kazior ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar, 7639d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 7640d7579d12SMichal Kazior { 7641d7579d12SMichal Kazior size_t len = sizeof(struct wmi_10_1_peer_assoc_complete_cmd); 7642d7579d12SMichal Kazior struct sk_buff *skb; 7643d7579d12SMichal Kazior int ret; 7644d7579d12SMichal Kazior 7645d7579d12SMichal Kazior ret = ath10k_wmi_peer_assoc_check_arg(arg); 7646d7579d12SMichal Kazior if (ret) 7647d7579d12SMichal Kazior return ERR_PTR(ret); 7648d7579d12SMichal Kazior 7649d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 7650d7579d12SMichal Kazior if (!skb) 7651d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 7652d7579d12SMichal Kazior 7653d7579d12SMichal Kazior ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg); 7654d7579d12SMichal Kazior 7655d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 7656d7579d12SMichal Kazior "wmi peer assoc vdev %d addr %pM (%s)\n", 7657d7579d12SMichal Kazior arg->vdev_id, arg->addr, 7658d7579d12SMichal Kazior arg->peer_reassoc ? "reassociate" : "new"); 7659d7579d12SMichal Kazior return skb; 7660d7579d12SMichal Kazior } 7661d7579d12SMichal Kazior 7662d7579d12SMichal Kazior static struct sk_buff * 7663d7579d12SMichal Kazior ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar, 7664d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 7665d7579d12SMichal Kazior { 7666d7579d12SMichal Kazior size_t len = sizeof(struct wmi_10_2_peer_assoc_complete_cmd); 7667d7579d12SMichal Kazior struct sk_buff *skb; 7668d7579d12SMichal Kazior int ret; 7669d7579d12SMichal Kazior 7670d7579d12SMichal Kazior ret = ath10k_wmi_peer_assoc_check_arg(arg); 7671d7579d12SMichal Kazior if (ret) 7672d7579d12SMichal Kazior return ERR_PTR(ret); 7673d7579d12SMichal Kazior 7674d7579d12SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, len); 7675d7579d12SMichal Kazior if (!skb) 7676d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 7677d7579d12SMichal Kazior 7678d7579d12SMichal Kazior ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg); 7679d7579d12SMichal Kazior 7680d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 7681d7579d12SMichal Kazior "wmi peer assoc vdev %d addr %pM (%s)\n", 7682d7579d12SMichal Kazior arg->vdev_id, arg->addr, 7683d7579d12SMichal Kazior arg->peer_reassoc ? "reassociate" : "new"); 7684d7579d12SMichal Kazior return skb; 76855e3dd157SKalle Valo } 76865e3dd157SKalle Valo 7687a57a6a27SRajkumar Manoharan static struct sk_buff * 7688b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar, 7689b54e16f1SVasanthakumar Thiagarajan const struct wmi_peer_assoc_complete_arg *arg) 7690b54e16f1SVasanthakumar Thiagarajan { 7691b54e16f1SVasanthakumar Thiagarajan size_t len = sizeof(struct wmi_10_4_peer_assoc_complete_cmd); 7692b54e16f1SVasanthakumar Thiagarajan struct sk_buff *skb; 7693b54e16f1SVasanthakumar Thiagarajan int ret; 7694b54e16f1SVasanthakumar Thiagarajan 7695b54e16f1SVasanthakumar Thiagarajan ret = ath10k_wmi_peer_assoc_check_arg(arg); 7696b54e16f1SVasanthakumar Thiagarajan if (ret) 7697b54e16f1SVasanthakumar Thiagarajan return ERR_PTR(ret); 7698b54e16f1SVasanthakumar Thiagarajan 7699b54e16f1SVasanthakumar Thiagarajan skb = ath10k_wmi_alloc_skb(ar, len); 7700b54e16f1SVasanthakumar Thiagarajan if (!skb) 7701b54e16f1SVasanthakumar Thiagarajan return ERR_PTR(-ENOMEM); 7702b54e16f1SVasanthakumar Thiagarajan 7703b54e16f1SVasanthakumar Thiagarajan ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg); 7704b54e16f1SVasanthakumar Thiagarajan 7705b54e16f1SVasanthakumar Thiagarajan ath10k_dbg(ar, ATH10K_DBG_WMI, 7706b54e16f1SVasanthakumar Thiagarajan "wmi peer assoc vdev %d addr %pM (%s)\n", 7707b54e16f1SVasanthakumar Thiagarajan arg->vdev_id, arg->addr, 7708b54e16f1SVasanthakumar Thiagarajan arg->peer_reassoc ? "reassociate" : "new"); 7709b54e16f1SVasanthakumar Thiagarajan return skb; 7710b54e16f1SVasanthakumar Thiagarajan } 7711b54e16f1SVasanthakumar Thiagarajan 7712b54e16f1SVasanthakumar Thiagarajan static struct sk_buff * 7713a57a6a27SRajkumar Manoharan ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar) 7714a57a6a27SRajkumar Manoharan { 7715a57a6a27SRajkumar Manoharan struct sk_buff *skb; 7716a57a6a27SRajkumar Manoharan 7717a57a6a27SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, 0); 7718a57a6a27SRajkumar Manoharan if (!skb) 7719a57a6a27SRajkumar Manoharan return ERR_PTR(-ENOMEM); 7720a57a6a27SRajkumar Manoharan 7721a57a6a27SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n"); 7722a57a6a27SRajkumar Manoharan return skb; 7723a57a6a27SRajkumar Manoharan } 7724a57a6a27SRajkumar Manoharan 77258a0b459eSRajkumar Manoharan static struct sk_buff * 77268a0b459eSRajkumar Manoharan ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k *ar, 77278a0b459eSRajkumar Manoharan enum wmi_bss_survey_req_type type) 77288a0b459eSRajkumar Manoharan { 77298a0b459eSRajkumar Manoharan struct wmi_pdev_chan_info_req_cmd *cmd; 77308a0b459eSRajkumar Manoharan struct sk_buff *skb; 77318a0b459eSRajkumar Manoharan 77328a0b459eSRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 77338a0b459eSRajkumar Manoharan if (!skb) 77348a0b459eSRajkumar Manoharan return ERR_PTR(-ENOMEM); 77358a0b459eSRajkumar Manoharan 77368a0b459eSRajkumar Manoharan cmd = (struct wmi_pdev_chan_info_req_cmd *)skb->data; 77378a0b459eSRajkumar Manoharan cmd->type = __cpu_to_le32(type); 77388a0b459eSRajkumar Manoharan 77398a0b459eSRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 77408a0b459eSRajkumar Manoharan "wmi pdev bss info request type %d\n", type); 77418a0b459eSRajkumar Manoharan 77428a0b459eSRajkumar Manoharan return skb; 77438a0b459eSRajkumar Manoharan } 77448a0b459eSRajkumar Manoharan 7745748afc47SMichal Kazior /* This function assumes the beacon is already DMA mapped */ 7746d7579d12SMichal Kazior static struct sk_buff * 77479ad50182SMichal Kazior ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn, 77489ad50182SMichal Kazior size_t bcn_len, u32 bcn_paddr, bool dtim_zero, 77499ad50182SMichal Kazior bool deliver_cab) 77505e3dd157SKalle Valo { 7751748afc47SMichal Kazior struct wmi_bcn_tx_ref_cmd *cmd; 77525e3dd157SKalle Valo struct sk_buff *skb; 7753748afc47SMichal Kazior struct ieee80211_hdr *hdr; 7754748afc47SMichal Kazior u16 fc; 77555e3dd157SKalle Valo 77567aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 77575e3dd157SKalle Valo if (!skb) 7758d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 77595e3dd157SKalle Valo 77609ad50182SMichal Kazior hdr = (struct ieee80211_hdr *)bcn; 7761748afc47SMichal Kazior fc = le16_to_cpu(hdr->frame_control); 77625e3dd157SKalle Valo 7763748afc47SMichal Kazior cmd = (struct wmi_bcn_tx_ref_cmd *)skb->data; 77649ad50182SMichal Kazior cmd->vdev_id = __cpu_to_le32(vdev_id); 77659ad50182SMichal Kazior cmd->data_len = __cpu_to_le32(bcn_len); 77669ad50182SMichal Kazior cmd->data_ptr = __cpu_to_le32(bcn_paddr); 7767748afc47SMichal Kazior cmd->msdu_id = 0; 7768748afc47SMichal Kazior cmd->frame_control = __cpu_to_le32(fc); 7769748afc47SMichal Kazior cmd->flags = 0; 777024c88f78SMichal Kazior cmd->antenna_mask = __cpu_to_le32(WMI_BCN_TX_REF_DEF_ANTENNA); 7771748afc47SMichal Kazior 77729ad50182SMichal Kazior if (dtim_zero) 7773748afc47SMichal Kazior cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DTIM_ZERO); 7774748afc47SMichal Kazior 77759ad50182SMichal Kazior if (deliver_cab) 7776748afc47SMichal Kazior cmd->flags |= __cpu_to_le32(WMI_BCN_TX_REF_FLAG_DELIVER_CAB); 7777748afc47SMichal Kazior 7778d7579d12SMichal Kazior return skb; 77795e3dd157SKalle Valo } 77805e3dd157SKalle Valo 77815e752e42SMichal Kazior void ath10k_wmi_set_wmm_param(struct wmi_wmm_params *params, 77825e3dd157SKalle Valo const struct wmi_wmm_params_arg *arg) 77835e3dd157SKalle Valo { 77845e3dd157SKalle Valo params->cwmin = __cpu_to_le32(arg->cwmin); 77855e3dd157SKalle Valo params->cwmax = __cpu_to_le32(arg->cwmax); 77865e3dd157SKalle Valo params->aifs = __cpu_to_le32(arg->aifs); 77875e3dd157SKalle Valo params->txop = __cpu_to_le32(arg->txop); 77885e3dd157SKalle Valo params->acm = __cpu_to_le32(arg->acm); 77895e3dd157SKalle Valo params->no_ack = __cpu_to_le32(arg->no_ack); 77905e3dd157SKalle Valo } 77915e3dd157SKalle Valo 7792d7579d12SMichal Kazior static struct sk_buff * 7793d7579d12SMichal Kazior ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar, 77945e752e42SMichal Kazior const struct wmi_wmm_params_all_arg *arg) 77955e3dd157SKalle Valo { 77965e3dd157SKalle Valo struct wmi_pdev_set_wmm_params *cmd; 77975e3dd157SKalle Valo struct sk_buff *skb; 77985e3dd157SKalle Valo 77997aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 78005e3dd157SKalle Valo if (!skb) 7801d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 78025e3dd157SKalle Valo 78035e3dd157SKalle Valo cmd = (struct wmi_pdev_set_wmm_params *)skb->data; 78045e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_be, &arg->ac_be); 78055e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_bk, &arg->ac_bk); 78065e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_vi, &arg->ac_vi); 78075e752e42SMichal Kazior ath10k_wmi_set_wmm_param(&cmd->ac_vo, &arg->ac_vo); 78085e3dd157SKalle Valo 78097aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n"); 7810d7579d12SMichal Kazior return skb; 78115e3dd157SKalle Valo } 78125e3dd157SKalle Valo 7813d7579d12SMichal Kazior static struct sk_buff * 7814de23d3efSMichal Kazior ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask) 78155e3dd157SKalle Valo { 78165e3dd157SKalle Valo struct wmi_request_stats_cmd *cmd; 78175e3dd157SKalle Valo struct sk_buff *skb; 78185e3dd157SKalle Valo 78197aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 78205e3dd157SKalle Valo if (!skb) 7821d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 78225e3dd157SKalle Valo 78235e3dd157SKalle Valo cmd = (struct wmi_request_stats_cmd *)skb->data; 7824de23d3efSMichal Kazior cmd->stats_id = __cpu_to_le32(stats_mask); 78255e3dd157SKalle Valo 7826de23d3efSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n", 7827de23d3efSMichal Kazior stats_mask); 7828d7579d12SMichal Kazior return skb; 78295e3dd157SKalle Valo } 78309cfbce75SMichal Kazior 7831d7579d12SMichal Kazior static struct sk_buff * 7832d7579d12SMichal Kazior ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar, 78339cfbce75SMichal Kazior enum wmi_force_fw_hang_type type, u32 delay_ms) 78349cfbce75SMichal Kazior { 78359cfbce75SMichal Kazior struct wmi_force_fw_hang_cmd *cmd; 78369cfbce75SMichal Kazior struct sk_buff *skb; 78379cfbce75SMichal Kazior 78387aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 78399cfbce75SMichal Kazior if (!skb) 7840d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 78419cfbce75SMichal Kazior 78429cfbce75SMichal Kazior cmd = (struct wmi_force_fw_hang_cmd *)skb->data; 78439cfbce75SMichal Kazior cmd->type = __cpu_to_le32(type); 78449cfbce75SMichal Kazior cmd->delay_ms = __cpu_to_le32(delay_ms); 78459cfbce75SMichal Kazior 78467aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n", 78479cfbce75SMichal Kazior type, delay_ms); 7848d7579d12SMichal Kazior return skb; 78499cfbce75SMichal Kazior } 7850f118a3e5SKalle Valo 7851d7579d12SMichal Kazior static struct sk_buff * 7852afcbc82cSMaharaja Kennadyrajan ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable, 7853467210a6SSenthilKumar Jegadeesan u32 log_level) 7854f118a3e5SKalle Valo { 7855f118a3e5SKalle Valo struct wmi_dbglog_cfg_cmd *cmd; 7856f118a3e5SKalle Valo struct sk_buff *skb; 7857f118a3e5SKalle Valo u32 cfg; 7858f118a3e5SKalle Valo 78597aa7a72aSMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7860f118a3e5SKalle Valo if (!skb) 7861d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 7862f118a3e5SKalle Valo 7863f118a3e5SKalle Valo cmd = (struct wmi_dbglog_cfg_cmd *)skb->data; 7864f118a3e5SKalle Valo 7865f118a3e5SKalle Valo if (module_enable) { 7866467210a6SSenthilKumar Jegadeesan cfg = SM(log_level, 7867f118a3e5SKalle Valo ATH10K_DBGLOG_CFG_LOG_LVL); 7868f118a3e5SKalle Valo } else { 7869f118a3e5SKalle Valo /* set back defaults, all modules with WARN level */ 7870f118a3e5SKalle Valo cfg = SM(ATH10K_DBGLOG_LEVEL_WARN, 7871f118a3e5SKalle Valo ATH10K_DBGLOG_CFG_LOG_LVL); 7872f118a3e5SKalle Valo module_enable = ~0; 7873f118a3e5SKalle Valo } 7874f118a3e5SKalle Valo 7875f118a3e5SKalle Valo cmd->module_enable = __cpu_to_le32(module_enable); 7876f118a3e5SKalle Valo cmd->module_valid = __cpu_to_le32(~0); 7877f118a3e5SKalle Valo cmd->config_enable = __cpu_to_le32(cfg); 7878f118a3e5SKalle Valo cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK); 7879f118a3e5SKalle Valo 78807aa7a72aSMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 7881f118a3e5SKalle Valo "wmi dbglog cfg modules %08x %08x config %08x %08x\n", 7882f118a3e5SKalle Valo __le32_to_cpu(cmd->module_enable), 7883f118a3e5SKalle Valo __le32_to_cpu(cmd->module_valid), 7884f118a3e5SKalle Valo __le32_to_cpu(cmd->config_enable), 7885f118a3e5SKalle Valo __le32_to_cpu(cmd->config_valid)); 7886d7579d12SMichal Kazior return skb; 7887f118a3e5SKalle Valo } 7888b79b9baaSMichal Kazior 7889d7579d12SMichal Kazior static struct sk_buff * 7890afcbc82cSMaharaja Kennadyrajan ath10k_wmi_10_4_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable, 7891afcbc82cSMaharaja Kennadyrajan u32 log_level) 7892afcbc82cSMaharaja Kennadyrajan { 7893afcbc82cSMaharaja Kennadyrajan struct wmi_10_4_dbglog_cfg_cmd *cmd; 7894afcbc82cSMaharaja Kennadyrajan struct sk_buff *skb; 7895afcbc82cSMaharaja Kennadyrajan u32 cfg; 7896afcbc82cSMaharaja Kennadyrajan 7897afcbc82cSMaharaja Kennadyrajan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7898afcbc82cSMaharaja Kennadyrajan if (!skb) 7899afcbc82cSMaharaja Kennadyrajan return ERR_PTR(-ENOMEM); 7900afcbc82cSMaharaja Kennadyrajan 7901afcbc82cSMaharaja Kennadyrajan cmd = (struct wmi_10_4_dbglog_cfg_cmd *)skb->data; 7902afcbc82cSMaharaja Kennadyrajan 7903afcbc82cSMaharaja Kennadyrajan if (module_enable) { 7904afcbc82cSMaharaja Kennadyrajan cfg = SM(log_level, 7905afcbc82cSMaharaja Kennadyrajan ATH10K_DBGLOG_CFG_LOG_LVL); 7906afcbc82cSMaharaja Kennadyrajan } else { 7907afcbc82cSMaharaja Kennadyrajan /* set back defaults, all modules with WARN level */ 7908afcbc82cSMaharaja Kennadyrajan cfg = SM(ATH10K_DBGLOG_LEVEL_WARN, 7909afcbc82cSMaharaja Kennadyrajan ATH10K_DBGLOG_CFG_LOG_LVL); 7910afcbc82cSMaharaja Kennadyrajan module_enable = ~0; 7911afcbc82cSMaharaja Kennadyrajan } 7912afcbc82cSMaharaja Kennadyrajan 7913afcbc82cSMaharaja Kennadyrajan cmd->module_enable = __cpu_to_le64(module_enable); 7914afcbc82cSMaharaja Kennadyrajan cmd->module_valid = __cpu_to_le64(~0); 7915afcbc82cSMaharaja Kennadyrajan cmd->config_enable = __cpu_to_le32(cfg); 7916afcbc82cSMaharaja Kennadyrajan cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK); 7917afcbc82cSMaharaja Kennadyrajan 7918afcbc82cSMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, 7919afcbc82cSMaharaja Kennadyrajan "wmi dbglog cfg modules 0x%016llx 0x%016llx config %08x %08x\n", 7920afcbc82cSMaharaja Kennadyrajan __le64_to_cpu(cmd->module_enable), 7921afcbc82cSMaharaja Kennadyrajan __le64_to_cpu(cmd->module_valid), 7922afcbc82cSMaharaja Kennadyrajan __le32_to_cpu(cmd->config_enable), 7923afcbc82cSMaharaja Kennadyrajan __le32_to_cpu(cmd->config_valid)); 7924afcbc82cSMaharaja Kennadyrajan return skb; 7925afcbc82cSMaharaja Kennadyrajan } 7926afcbc82cSMaharaja Kennadyrajan 7927afcbc82cSMaharaja Kennadyrajan static struct sk_buff * 7928d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap) 792990174455SRajkumar Manoharan { 793090174455SRajkumar Manoharan struct wmi_pdev_pktlog_enable_cmd *cmd; 793190174455SRajkumar Manoharan struct sk_buff *skb; 793290174455SRajkumar Manoharan 793390174455SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 793490174455SRajkumar Manoharan if (!skb) 7935d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 793690174455SRajkumar Manoharan 793790174455SRajkumar Manoharan ev_bitmap &= ATH10K_PKTLOG_ANY; 793890174455SRajkumar Manoharan 793990174455SRajkumar Manoharan cmd = (struct wmi_pdev_pktlog_enable_cmd *)skb->data; 794090174455SRajkumar Manoharan cmd->ev_bitmap = __cpu_to_le32(ev_bitmap); 7941d7579d12SMichal Kazior 7942d7579d12SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n", 7943d7579d12SMichal Kazior ev_bitmap); 7944d7579d12SMichal Kazior return skb; 794590174455SRajkumar Manoharan } 794690174455SRajkumar Manoharan 7947d7579d12SMichal Kazior static struct sk_buff * 7948d7579d12SMichal Kazior ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar) 794990174455SRajkumar Manoharan { 795090174455SRajkumar Manoharan struct sk_buff *skb; 795190174455SRajkumar Manoharan 795290174455SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, 0); 795390174455SRajkumar Manoharan if (!skb) 7954d7579d12SMichal Kazior return ERR_PTR(-ENOMEM); 795590174455SRajkumar Manoharan 795690174455SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n"); 7957d7579d12SMichal Kazior return skb; 795890174455SRajkumar Manoharan } 795990174455SRajkumar Manoharan 7960ffdd738dSRajkumar Manoharan static struct sk_buff * 7961ffdd738dSRajkumar Manoharan ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period, 7962ffdd738dSRajkumar Manoharan u32 duration, u32 next_offset, 7963ffdd738dSRajkumar Manoharan u32 enabled) 7964ffdd738dSRajkumar Manoharan { 7965ffdd738dSRajkumar Manoharan struct wmi_pdev_set_quiet_cmd *cmd; 7966ffdd738dSRajkumar Manoharan struct sk_buff *skb; 7967ffdd738dSRajkumar Manoharan 7968ffdd738dSRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7969ffdd738dSRajkumar Manoharan if (!skb) 7970ffdd738dSRajkumar Manoharan return ERR_PTR(-ENOMEM); 7971ffdd738dSRajkumar Manoharan 7972ffdd738dSRajkumar Manoharan cmd = (struct wmi_pdev_set_quiet_cmd *)skb->data; 7973ffdd738dSRajkumar Manoharan cmd->period = __cpu_to_le32(period); 7974ffdd738dSRajkumar Manoharan cmd->duration = __cpu_to_le32(duration); 7975ffdd738dSRajkumar Manoharan cmd->next_start = __cpu_to_le32(next_offset); 7976ffdd738dSRajkumar Manoharan cmd->enabled = __cpu_to_le32(enabled); 7977ffdd738dSRajkumar Manoharan 7978ffdd738dSRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 7979ffdd738dSRajkumar Manoharan "wmi quiet param: period %u duration %u enabled %d\n", 7980ffdd738dSRajkumar Manoharan period, duration, enabled); 7981ffdd738dSRajkumar Manoharan return skb; 7982ffdd738dSRajkumar Manoharan } 7983ffdd738dSRajkumar Manoharan 7984dc8ab278SRajkumar Manoharan static struct sk_buff * 7985dc8ab278SRajkumar Manoharan ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id, 7986dc8ab278SRajkumar Manoharan const u8 *mac) 7987dc8ab278SRajkumar Manoharan { 7988dc8ab278SRajkumar Manoharan struct wmi_addba_clear_resp_cmd *cmd; 7989dc8ab278SRajkumar Manoharan struct sk_buff *skb; 7990dc8ab278SRajkumar Manoharan 7991dc8ab278SRajkumar Manoharan if (!mac) 7992dc8ab278SRajkumar Manoharan return ERR_PTR(-EINVAL); 7993dc8ab278SRajkumar Manoharan 7994dc8ab278SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 7995dc8ab278SRajkumar Manoharan if (!skb) 7996dc8ab278SRajkumar Manoharan return ERR_PTR(-ENOMEM); 7997dc8ab278SRajkumar Manoharan 7998dc8ab278SRajkumar Manoharan cmd = (struct wmi_addba_clear_resp_cmd *)skb->data; 7999dc8ab278SRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 8000dc8ab278SRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 8001dc8ab278SRajkumar Manoharan 8002dc8ab278SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 8003dc8ab278SRajkumar Manoharan "wmi addba clear resp vdev_id 0x%X mac_addr %pM\n", 8004dc8ab278SRajkumar Manoharan vdev_id, mac); 8005dc8ab278SRajkumar Manoharan return skb; 8006dc8ab278SRajkumar Manoharan } 8007dc8ab278SRajkumar Manoharan 800865c0893dSRajkumar Manoharan static struct sk_buff * 800965c0893dSRajkumar Manoharan ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 801065c0893dSRajkumar Manoharan u32 tid, u32 buf_size) 801165c0893dSRajkumar Manoharan { 801265c0893dSRajkumar Manoharan struct wmi_addba_send_cmd *cmd; 801365c0893dSRajkumar Manoharan struct sk_buff *skb; 801465c0893dSRajkumar Manoharan 801565c0893dSRajkumar Manoharan if (!mac) 801665c0893dSRajkumar Manoharan return ERR_PTR(-EINVAL); 801765c0893dSRajkumar Manoharan 801865c0893dSRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 801965c0893dSRajkumar Manoharan if (!skb) 802065c0893dSRajkumar Manoharan return ERR_PTR(-ENOMEM); 802165c0893dSRajkumar Manoharan 802265c0893dSRajkumar Manoharan cmd = (struct wmi_addba_send_cmd *)skb->data; 802365c0893dSRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 802465c0893dSRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 802565c0893dSRajkumar Manoharan cmd->tid = __cpu_to_le32(tid); 802665c0893dSRajkumar Manoharan cmd->buffersize = __cpu_to_le32(buf_size); 802765c0893dSRajkumar Manoharan 802865c0893dSRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 802965c0893dSRajkumar Manoharan "wmi addba send vdev_id 0x%X mac_addr %pM tid %u bufsize %u\n", 803065c0893dSRajkumar Manoharan vdev_id, mac, tid, buf_size); 803165c0893dSRajkumar Manoharan return skb; 803265c0893dSRajkumar Manoharan } 803365c0893dSRajkumar Manoharan 803411597413SRajkumar Manoharan static struct sk_buff * 803511597413SRajkumar Manoharan ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac, 803611597413SRajkumar Manoharan u32 tid, u32 status) 803711597413SRajkumar Manoharan { 803811597413SRajkumar Manoharan struct wmi_addba_setresponse_cmd *cmd; 803911597413SRajkumar Manoharan struct sk_buff *skb; 804011597413SRajkumar Manoharan 804111597413SRajkumar Manoharan if (!mac) 804211597413SRajkumar Manoharan return ERR_PTR(-EINVAL); 804311597413SRajkumar Manoharan 804411597413SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 804511597413SRajkumar Manoharan if (!skb) 804611597413SRajkumar Manoharan return ERR_PTR(-ENOMEM); 804711597413SRajkumar Manoharan 804811597413SRajkumar Manoharan cmd = (struct wmi_addba_setresponse_cmd *)skb->data; 804911597413SRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 805011597413SRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 805111597413SRajkumar Manoharan cmd->tid = __cpu_to_le32(tid); 805211597413SRajkumar Manoharan cmd->statuscode = __cpu_to_le32(status); 805311597413SRajkumar Manoharan 805411597413SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 805511597413SRajkumar Manoharan "wmi addba set resp vdev_id 0x%X mac_addr %pM tid %u status %u\n", 805611597413SRajkumar Manoharan vdev_id, mac, tid, status); 805711597413SRajkumar Manoharan return skb; 805811597413SRajkumar Manoharan } 805911597413SRajkumar Manoharan 806050abef85SRajkumar Manoharan static struct sk_buff * 806150abef85SRajkumar Manoharan ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 806250abef85SRajkumar Manoharan u32 tid, u32 initiator, u32 reason) 806350abef85SRajkumar Manoharan { 806450abef85SRajkumar Manoharan struct wmi_delba_send_cmd *cmd; 806550abef85SRajkumar Manoharan struct sk_buff *skb; 806650abef85SRajkumar Manoharan 806750abef85SRajkumar Manoharan if (!mac) 806850abef85SRajkumar Manoharan return ERR_PTR(-EINVAL); 806950abef85SRajkumar Manoharan 807050abef85SRajkumar Manoharan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 807150abef85SRajkumar Manoharan if (!skb) 807250abef85SRajkumar Manoharan return ERR_PTR(-ENOMEM); 807350abef85SRajkumar Manoharan 807450abef85SRajkumar Manoharan cmd = (struct wmi_delba_send_cmd *)skb->data; 807550abef85SRajkumar Manoharan cmd->vdev_id = __cpu_to_le32(vdev_id); 807650abef85SRajkumar Manoharan ether_addr_copy(cmd->peer_macaddr.addr, mac); 807750abef85SRajkumar Manoharan cmd->tid = __cpu_to_le32(tid); 807850abef85SRajkumar Manoharan cmd->initiator = __cpu_to_le32(initiator); 807950abef85SRajkumar Manoharan cmd->reasoncode = __cpu_to_le32(reason); 808050abef85SRajkumar Manoharan 808150abef85SRajkumar Manoharan ath10k_dbg(ar, ATH10K_DBG_WMI, 808250abef85SRajkumar Manoharan "wmi delba send vdev_id 0x%X mac_addr %pM tid %u initiator %u reason %u\n", 808350abef85SRajkumar Manoharan vdev_id, mac, tid, initiator, reason); 808450abef85SRajkumar Manoharan return skb; 808550abef85SRajkumar Manoharan } 808650abef85SRajkumar Manoharan 808729542666SMaharaja Kennadyrajan static struct sk_buff * 808829542666SMaharaja Kennadyrajan ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param) 808929542666SMaharaja Kennadyrajan { 809029542666SMaharaja Kennadyrajan struct wmi_pdev_get_tpc_config_cmd *cmd; 809129542666SMaharaja Kennadyrajan struct sk_buff *skb; 809229542666SMaharaja Kennadyrajan 809329542666SMaharaja Kennadyrajan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 809429542666SMaharaja Kennadyrajan if (!skb) 809529542666SMaharaja Kennadyrajan return ERR_PTR(-ENOMEM); 809629542666SMaharaja Kennadyrajan 809729542666SMaharaja Kennadyrajan cmd = (struct wmi_pdev_get_tpc_config_cmd *)skb->data; 809829542666SMaharaja Kennadyrajan cmd->param = __cpu_to_le32(param); 809929542666SMaharaja Kennadyrajan 810029542666SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, 8101b022ca25SMaharaja Kennadyrajan "wmi pdev get tpc config param %d\n", param); 810229542666SMaharaja Kennadyrajan return skb; 810329542666SMaharaja Kennadyrajan } 810429542666SMaharaja Kennadyrajan 8105bc6f9ae6SManikanta Pubbisetty size_t ath10k_wmi_fw_stats_num_peers(struct list_head *head) 8106bc6f9ae6SManikanta Pubbisetty { 8107bc6f9ae6SManikanta Pubbisetty struct ath10k_fw_stats_peer *i; 8108bc6f9ae6SManikanta Pubbisetty size_t num = 0; 8109bc6f9ae6SManikanta Pubbisetty 8110bc6f9ae6SManikanta Pubbisetty list_for_each_entry(i, head, list) 8111bc6f9ae6SManikanta Pubbisetty ++num; 8112bc6f9ae6SManikanta Pubbisetty 8113bc6f9ae6SManikanta Pubbisetty return num; 8114bc6f9ae6SManikanta Pubbisetty } 8115bc6f9ae6SManikanta Pubbisetty 8116bc6f9ae6SManikanta Pubbisetty size_t ath10k_wmi_fw_stats_num_vdevs(struct list_head *head) 8117bc6f9ae6SManikanta Pubbisetty { 8118bc6f9ae6SManikanta Pubbisetty struct ath10k_fw_stats_vdev *i; 8119bc6f9ae6SManikanta Pubbisetty size_t num = 0; 8120bc6f9ae6SManikanta Pubbisetty 8121bc6f9ae6SManikanta Pubbisetty list_for_each_entry(i, head, list) 8122bc6f9ae6SManikanta Pubbisetty ++num; 8123bc6f9ae6SManikanta Pubbisetty 8124bc6f9ae6SManikanta Pubbisetty return num; 8125bc6f9ae6SManikanta Pubbisetty } 8126bc6f9ae6SManikanta Pubbisetty 8127bc6f9ae6SManikanta Pubbisetty static void 8128bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_base_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8129bc6f9ae6SManikanta Pubbisetty char *buf, u32 *length) 8130bc6f9ae6SManikanta Pubbisetty { 8131bc6f9ae6SManikanta Pubbisetty u32 len = *length; 8132bc6f9ae6SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8133bc6f9ae6SManikanta Pubbisetty 8134bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8135bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n", 8136bc6f9ae6SManikanta Pubbisetty "ath10k PDEV stats"); 8137bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8138bc6f9ae6SManikanta Pubbisetty "================="); 8139bc6f9ae6SManikanta Pubbisetty 8140bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8141bc6f9ae6SManikanta Pubbisetty "Channel noise floor", pdev->ch_noise_floor); 8142bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8143bc6f9ae6SManikanta Pubbisetty "Channel TX power", pdev->chan_tx_power); 8144bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8145bc6f9ae6SManikanta Pubbisetty "TX frame count", pdev->tx_frame_count); 8146bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8147bc6f9ae6SManikanta Pubbisetty "RX frame count", pdev->rx_frame_count); 8148bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8149bc6f9ae6SManikanta Pubbisetty "RX clear count", pdev->rx_clear_count); 8150bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8151bc6f9ae6SManikanta Pubbisetty "Cycle count", pdev->cycle_count); 8152bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8153bc6f9ae6SManikanta Pubbisetty "PHY error count", pdev->phy_err_count); 8154bc6f9ae6SManikanta Pubbisetty 8155bc6f9ae6SManikanta Pubbisetty *length = len; 8156bc6f9ae6SManikanta Pubbisetty } 8157bc6f9ae6SManikanta Pubbisetty 8158bc6f9ae6SManikanta Pubbisetty static void 8159bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_extra_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8160bc6f9ae6SManikanta Pubbisetty char *buf, u32 *length) 8161bc6f9ae6SManikanta Pubbisetty { 8162bc6f9ae6SManikanta Pubbisetty u32 len = *length; 8163bc6f9ae6SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8164bc6f9ae6SManikanta Pubbisetty 8165bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8166bc6f9ae6SManikanta Pubbisetty "RTS bad count", pdev->rts_bad); 8167bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8168bc6f9ae6SManikanta Pubbisetty "RTS good count", pdev->rts_good); 8169bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8170bc6f9ae6SManikanta Pubbisetty "FCS bad count", pdev->fcs_bad); 8171bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8172bc6f9ae6SManikanta Pubbisetty "No beacon count", pdev->no_beacons); 8173bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10u\n", 8174bc6f9ae6SManikanta Pubbisetty "MIB int count", pdev->mib_int_count); 8175bc6f9ae6SManikanta Pubbisetty 8176bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8177bc6f9ae6SManikanta Pubbisetty *length = len; 8178bc6f9ae6SManikanta Pubbisetty } 8179bc6f9ae6SManikanta Pubbisetty 8180bc6f9ae6SManikanta Pubbisetty static void 8181bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_tx_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8182bc6f9ae6SManikanta Pubbisetty char *buf, u32 *length) 8183bc6f9ae6SManikanta Pubbisetty { 8184bc6f9ae6SManikanta Pubbisetty u32 len = *length; 8185bc6f9ae6SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8186bc6f9ae6SManikanta Pubbisetty 8187bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n%30s\n", 8188bc6f9ae6SManikanta Pubbisetty "ath10k PDEV TX stats"); 8189bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8190bc6f9ae6SManikanta Pubbisetty "================="); 8191bc6f9ae6SManikanta Pubbisetty 8192bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8193bc6f9ae6SManikanta Pubbisetty "HTT cookies queued", pdev->comp_queued); 8194bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8195bc6f9ae6SManikanta Pubbisetty "HTT cookies disp.", pdev->comp_delivered); 8196bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8197bc6f9ae6SManikanta Pubbisetty "MSDU queued", pdev->msdu_enqued); 8198bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8199bc6f9ae6SManikanta Pubbisetty "MPDU queued", pdev->mpdu_enqued); 8200bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8201bc6f9ae6SManikanta Pubbisetty "MSDUs dropped", pdev->wmm_drop); 8202bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8203bc6f9ae6SManikanta Pubbisetty "Local enqued", pdev->local_enqued); 8204bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8205bc6f9ae6SManikanta Pubbisetty "Local freed", pdev->local_freed); 8206bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8207bc6f9ae6SManikanta Pubbisetty "HW queued", pdev->hw_queued); 8208bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8209bc6f9ae6SManikanta Pubbisetty "PPDUs reaped", pdev->hw_reaped); 8210bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8211bc6f9ae6SManikanta Pubbisetty "Num underruns", pdev->underrun); 8212bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8213bc6f9ae6SManikanta Pubbisetty "PPDUs cleaned", pdev->tx_abort); 8214bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8215bc6f9ae6SManikanta Pubbisetty "MPDUs requed", pdev->mpdus_requed); 8216bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8217bc6f9ae6SManikanta Pubbisetty "Excessive retries", pdev->tx_ko); 8218bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8219bc6f9ae6SManikanta Pubbisetty "HW rate", pdev->data_rc); 8220bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 82216ce36faeSColin Ian King "Sched self triggers", pdev->self_triggers); 8222bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8223bc6f9ae6SManikanta Pubbisetty "Dropped due to SW retries", 8224bc6f9ae6SManikanta Pubbisetty pdev->sw_retry_failure); 8225bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8226bc6f9ae6SManikanta Pubbisetty "Illegal rate phy errors", 8227bc6f9ae6SManikanta Pubbisetty pdev->illgl_rate_phy_err); 8228bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8229bc6f9ae6SManikanta Pubbisetty "Pdev continuous xretry", pdev->pdev_cont_xretry); 8230bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8231bc6f9ae6SManikanta Pubbisetty "TX timeout", pdev->pdev_tx_timeout); 8232bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8233bc6f9ae6SManikanta Pubbisetty "PDEV resets", pdev->pdev_resets); 8234bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8235bc6f9ae6SManikanta Pubbisetty "PHY underrun", pdev->phy_underrun); 8236bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8237bc6f9ae6SManikanta Pubbisetty "MPDU is more than txop limit", pdev->txop_ovf); 8238bc6f9ae6SManikanta Pubbisetty *length = len; 8239bc6f9ae6SManikanta Pubbisetty } 8240bc6f9ae6SManikanta Pubbisetty 8241bc6f9ae6SManikanta Pubbisetty static void 8242bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_rx_stats_fill(const struct ath10k_fw_stats_pdev *pdev, 8243bc6f9ae6SManikanta Pubbisetty char *buf, u32 *length) 8244bc6f9ae6SManikanta Pubbisetty { 8245bc6f9ae6SManikanta Pubbisetty u32 len = *length; 8246bc6f9ae6SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8247bc6f9ae6SManikanta Pubbisetty 8248bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n%30s\n", 8249bc6f9ae6SManikanta Pubbisetty "ath10k PDEV RX stats"); 8250bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8251bc6f9ae6SManikanta Pubbisetty "================="); 8252bc6f9ae6SManikanta Pubbisetty 8253bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8254bc6f9ae6SManikanta Pubbisetty "Mid PPDU route change", 8255bc6f9ae6SManikanta Pubbisetty pdev->mid_ppdu_route_change); 8256bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8257bc6f9ae6SManikanta Pubbisetty "Tot. number of statuses", pdev->status_rcvd); 8258bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8259bc6f9ae6SManikanta Pubbisetty "Extra frags on rings 0", pdev->r0_frags); 8260bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8261bc6f9ae6SManikanta Pubbisetty "Extra frags on rings 1", pdev->r1_frags); 8262bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8263bc6f9ae6SManikanta Pubbisetty "Extra frags on rings 2", pdev->r2_frags); 8264bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8265bc6f9ae6SManikanta Pubbisetty "Extra frags on rings 3", pdev->r3_frags); 8266bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8267bc6f9ae6SManikanta Pubbisetty "MSDUs delivered to HTT", pdev->htt_msdus); 8268bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8269bc6f9ae6SManikanta Pubbisetty "MPDUs delivered to HTT", pdev->htt_mpdus); 8270bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8271bc6f9ae6SManikanta Pubbisetty "MSDUs delivered to stack", pdev->loc_msdus); 8272bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8273bc6f9ae6SManikanta Pubbisetty "MPDUs delivered to stack", pdev->loc_mpdus); 8274bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8275bc6f9ae6SManikanta Pubbisetty "Oversized AMSUs", pdev->oversize_amsdu); 8276bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8277bc6f9ae6SManikanta Pubbisetty "PHY errors", pdev->phy_errs); 8278bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8279bc6f9ae6SManikanta Pubbisetty "PHY errors drops", pdev->phy_err_drop); 8280bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 8281bc6f9ae6SManikanta Pubbisetty "MPDU errors (FCS, MIC, ENC)", pdev->mpdu_errs); 8282bc6f9ae6SManikanta Pubbisetty *length = len; 8283bc6f9ae6SManikanta Pubbisetty } 8284bc6f9ae6SManikanta Pubbisetty 8285bc6f9ae6SManikanta Pubbisetty static void 8286bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_vdev_stats_fill(const struct ath10k_fw_stats_vdev *vdev, 8287bc6f9ae6SManikanta Pubbisetty char *buf, u32 *length) 8288bc6f9ae6SManikanta Pubbisetty { 8289bc6f9ae6SManikanta Pubbisetty u32 len = *length; 8290bc6f9ae6SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8291bc6f9ae6SManikanta Pubbisetty int i; 8292bc6f9ae6SManikanta Pubbisetty 8293bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8294bc6f9ae6SManikanta Pubbisetty "vdev id", vdev->vdev_id); 8295bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8296bc6f9ae6SManikanta Pubbisetty "beacon snr", vdev->beacon_snr); 8297bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8298bc6f9ae6SManikanta Pubbisetty "data snr", vdev->data_snr); 8299bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8300bc6f9ae6SManikanta Pubbisetty "num rx frames", vdev->num_rx_frames); 8301bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8302bc6f9ae6SManikanta Pubbisetty "num rts fail", vdev->num_rts_fail); 8303bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8304bc6f9ae6SManikanta Pubbisetty "num rts success", vdev->num_rts_success); 8305bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8306bc6f9ae6SManikanta Pubbisetty "num rx err", vdev->num_rx_err); 8307bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8308bc6f9ae6SManikanta Pubbisetty "num rx discard", vdev->num_rx_discard); 8309bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8310bc6f9ae6SManikanta Pubbisetty "num tx not acked", vdev->num_tx_not_acked); 8311bc6f9ae6SManikanta Pubbisetty 8312bc6f9ae6SManikanta Pubbisetty for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++) 8313bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, 8314bc6f9ae6SManikanta Pubbisetty "%25s [%02d] %u\n", 8315bc6f9ae6SManikanta Pubbisetty "num tx frames", i, 8316bc6f9ae6SManikanta Pubbisetty vdev->num_tx_frames[i]); 8317bc6f9ae6SManikanta Pubbisetty 8318bc6f9ae6SManikanta Pubbisetty for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++) 8319bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, 8320bc6f9ae6SManikanta Pubbisetty "%25s [%02d] %u\n", 8321bc6f9ae6SManikanta Pubbisetty "num tx frames retries", i, 8322bc6f9ae6SManikanta Pubbisetty vdev->num_tx_frames_retries[i]); 8323bc6f9ae6SManikanta Pubbisetty 8324bc6f9ae6SManikanta Pubbisetty for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++) 8325bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, 8326bc6f9ae6SManikanta Pubbisetty "%25s [%02d] %u\n", 8327bc6f9ae6SManikanta Pubbisetty "num tx frames failures", i, 8328bc6f9ae6SManikanta Pubbisetty vdev->num_tx_frames_failures[i]); 8329bc6f9ae6SManikanta Pubbisetty 8330bc6f9ae6SManikanta Pubbisetty for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++) 8331bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, 8332bc6f9ae6SManikanta Pubbisetty "%25s [%02d] 0x%08x\n", 8333bc6f9ae6SManikanta Pubbisetty "tx rate history", i, 8334bc6f9ae6SManikanta Pubbisetty vdev->tx_rate_history[i]); 8335bc6f9ae6SManikanta Pubbisetty 8336bc6f9ae6SManikanta Pubbisetty for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++) 8337bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, 8338bc6f9ae6SManikanta Pubbisetty "%25s [%02d] %u\n", 8339bc6f9ae6SManikanta Pubbisetty "beacon rssi history", i, 8340bc6f9ae6SManikanta Pubbisetty vdev->beacon_rssi_history[i]); 8341bc6f9ae6SManikanta Pubbisetty 8342bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8343bc6f9ae6SManikanta Pubbisetty *length = len; 8344bc6f9ae6SManikanta Pubbisetty } 8345bc6f9ae6SManikanta Pubbisetty 8346bc6f9ae6SManikanta Pubbisetty static void 8347bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_peer_stats_fill(const struct ath10k_fw_stats_peer *peer, 83485c51875cSBalaji Pothunoori char *buf, u32 *length, bool extended_peer) 8349bc6f9ae6SManikanta Pubbisetty { 8350bc6f9ae6SManikanta Pubbisetty u32 len = *length; 8351bc6f9ae6SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8352bc6f9ae6SManikanta Pubbisetty 8353bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %pM\n", 8354bc6f9ae6SManikanta Pubbisetty "Peer MAC address", peer->peer_macaddr); 8355bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8356bc6f9ae6SManikanta Pubbisetty "Peer RSSI", peer->peer_rssi); 8357bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8358bc6f9ae6SManikanta Pubbisetty "Peer TX rate", peer->peer_tx_rate); 8359bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 8360bc6f9ae6SManikanta Pubbisetty "Peer RX rate", peer->peer_rx_rate); 83615c51875cSBalaji Pothunoori if (!extended_peer) 8362f40a307eSSurabhi Vishnoi len += scnprintf(buf + len, buf_len - len, "%30s %llu\n", 8363de46c015SMohammed Shafi Shajakhan "Peer RX duration", peer->rx_duration); 8364de46c015SMohammed Shafi Shajakhan 8365bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8366bc6f9ae6SManikanta Pubbisetty *length = len; 8367bc6f9ae6SManikanta Pubbisetty } 8368bc6f9ae6SManikanta Pubbisetty 83695c51875cSBalaji Pothunoori static void 83705c51875cSBalaji Pothunoori ath10k_wmi_fw_extd_peer_stats_fill(const struct ath10k_fw_extd_stats_peer *peer, 83715c51875cSBalaji Pothunoori char *buf, u32 *length) 83725c51875cSBalaji Pothunoori { 83735c51875cSBalaji Pothunoori u32 len = *length; 83745c51875cSBalaji Pothunoori u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 83755c51875cSBalaji Pothunoori 83765c51875cSBalaji Pothunoori len += scnprintf(buf + len, buf_len - len, "%30s %pM\n", 83775c51875cSBalaji Pothunoori "Peer MAC address", peer->peer_macaddr); 83785c51875cSBalaji Pothunoori len += scnprintf(buf + len, buf_len - len, "%30s %llu\n", 83795c51875cSBalaji Pothunoori "Peer RX duration", peer->rx_duration); 83805c51875cSBalaji Pothunoori } 83815c51875cSBalaji Pothunoori 8382bc6f9ae6SManikanta Pubbisetty void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar, 8383bc6f9ae6SManikanta Pubbisetty struct ath10k_fw_stats *fw_stats, 8384bc6f9ae6SManikanta Pubbisetty char *buf) 8385bc6f9ae6SManikanta Pubbisetty { 8386bc6f9ae6SManikanta Pubbisetty u32 len = 0; 8387bc6f9ae6SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 8388bc6f9ae6SManikanta Pubbisetty const struct ath10k_fw_stats_pdev *pdev; 8389bc6f9ae6SManikanta Pubbisetty const struct ath10k_fw_stats_vdev *vdev; 8390bc6f9ae6SManikanta Pubbisetty const struct ath10k_fw_stats_peer *peer; 8391bc6f9ae6SManikanta Pubbisetty size_t num_peers; 8392bc6f9ae6SManikanta Pubbisetty size_t num_vdevs; 8393bc6f9ae6SManikanta Pubbisetty 8394bc6f9ae6SManikanta Pubbisetty spin_lock_bh(&ar->data_lock); 8395bc6f9ae6SManikanta Pubbisetty 8396bc6f9ae6SManikanta Pubbisetty pdev = list_first_entry_or_null(&fw_stats->pdevs, 8397bc6f9ae6SManikanta Pubbisetty struct ath10k_fw_stats_pdev, list); 8398bc6f9ae6SManikanta Pubbisetty if (!pdev) { 8399bc6f9ae6SManikanta Pubbisetty ath10k_warn(ar, "failed to get pdev stats\n"); 8400bc6f9ae6SManikanta Pubbisetty goto unlock; 8401bc6f9ae6SManikanta Pubbisetty } 8402bc6f9ae6SManikanta Pubbisetty 8403bc6f9ae6SManikanta Pubbisetty num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers); 8404bc6f9ae6SManikanta Pubbisetty num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs); 8405bc6f9ae6SManikanta Pubbisetty 8406bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len); 8407bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len); 8408bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len); 8409bc6f9ae6SManikanta Pubbisetty 8410bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8411bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8412bc6f9ae6SManikanta Pubbisetty "ath10k VDEV stats", num_vdevs); 8413bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8414bc6f9ae6SManikanta Pubbisetty "================="); 8415bc6f9ae6SManikanta Pubbisetty 8416bc6f9ae6SManikanta Pubbisetty list_for_each_entry(vdev, &fw_stats->vdevs, list) { 8417bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len); 8418bc6f9ae6SManikanta Pubbisetty } 8419bc6f9ae6SManikanta Pubbisetty 8420bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8421bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8422bc6f9ae6SManikanta Pubbisetty "ath10k PEER stats", num_peers); 8423bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8424bc6f9ae6SManikanta Pubbisetty "================="); 8425bc6f9ae6SManikanta Pubbisetty 8426bc6f9ae6SManikanta Pubbisetty list_for_each_entry(peer, &fw_stats->peers, list) { 84275c51875cSBalaji Pothunoori ath10k_wmi_fw_peer_stats_fill(peer, buf, &len, 84285c51875cSBalaji Pothunoori fw_stats->extended); 8429bc6f9ae6SManikanta Pubbisetty } 8430bc6f9ae6SManikanta Pubbisetty 8431bc6f9ae6SManikanta Pubbisetty unlock: 8432bc6f9ae6SManikanta Pubbisetty spin_unlock_bh(&ar->data_lock); 8433bc6f9ae6SManikanta Pubbisetty 8434bc6f9ae6SManikanta Pubbisetty if (len >= buf_len) 8435bc6f9ae6SManikanta Pubbisetty buf[len - 1] = 0; 8436bc6f9ae6SManikanta Pubbisetty else 8437bc6f9ae6SManikanta Pubbisetty buf[len] = 0; 8438bc6f9ae6SManikanta Pubbisetty } 8439bc6f9ae6SManikanta Pubbisetty 8440bc6f9ae6SManikanta Pubbisetty void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar, 8441bc6f9ae6SManikanta Pubbisetty struct ath10k_fw_stats *fw_stats, 8442bc6f9ae6SManikanta Pubbisetty char *buf) 8443bc6f9ae6SManikanta Pubbisetty { 8444bc6f9ae6SManikanta Pubbisetty unsigned int len = 0; 8445bc6f9ae6SManikanta Pubbisetty unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE; 8446bc6f9ae6SManikanta Pubbisetty const struct ath10k_fw_stats_pdev *pdev; 8447bc6f9ae6SManikanta Pubbisetty const struct ath10k_fw_stats_vdev *vdev; 8448bc6f9ae6SManikanta Pubbisetty const struct ath10k_fw_stats_peer *peer; 8449bc6f9ae6SManikanta Pubbisetty size_t num_peers; 8450bc6f9ae6SManikanta Pubbisetty size_t num_vdevs; 8451bc6f9ae6SManikanta Pubbisetty 8452bc6f9ae6SManikanta Pubbisetty spin_lock_bh(&ar->data_lock); 8453bc6f9ae6SManikanta Pubbisetty 8454bc6f9ae6SManikanta Pubbisetty pdev = list_first_entry_or_null(&fw_stats->pdevs, 8455bc6f9ae6SManikanta Pubbisetty struct ath10k_fw_stats_pdev, list); 8456bc6f9ae6SManikanta Pubbisetty if (!pdev) { 8457bc6f9ae6SManikanta Pubbisetty ath10k_warn(ar, "failed to get pdev stats\n"); 8458bc6f9ae6SManikanta Pubbisetty goto unlock; 8459bc6f9ae6SManikanta Pubbisetty } 8460bc6f9ae6SManikanta Pubbisetty 8461bc6f9ae6SManikanta Pubbisetty num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers); 8462bc6f9ae6SManikanta Pubbisetty num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs); 8463bc6f9ae6SManikanta Pubbisetty 8464bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len); 8465bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len); 8466bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len); 8467bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len); 8468bc6f9ae6SManikanta Pubbisetty 8469bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8470bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8471bc6f9ae6SManikanta Pubbisetty "ath10k VDEV stats", num_vdevs); 8472bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8473bc6f9ae6SManikanta Pubbisetty "================="); 8474bc6f9ae6SManikanta Pubbisetty 8475bc6f9ae6SManikanta Pubbisetty list_for_each_entry(vdev, &fw_stats->vdevs, list) { 8476bc6f9ae6SManikanta Pubbisetty ath10k_wmi_fw_vdev_stats_fill(vdev, buf, &len); 8477bc6f9ae6SManikanta Pubbisetty } 8478bc6f9ae6SManikanta Pubbisetty 8479bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 8480bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 8481bc6f9ae6SManikanta Pubbisetty "ath10k PEER stats", num_peers); 8482bc6f9ae6SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 8483bc6f9ae6SManikanta Pubbisetty "================="); 8484bc6f9ae6SManikanta Pubbisetty 8485bc6f9ae6SManikanta Pubbisetty list_for_each_entry(peer, &fw_stats->peers, list) { 84865c51875cSBalaji Pothunoori ath10k_wmi_fw_peer_stats_fill(peer, buf, &len, 84875c51875cSBalaji Pothunoori fw_stats->extended); 8488bc6f9ae6SManikanta Pubbisetty } 8489bc6f9ae6SManikanta Pubbisetty 8490bc6f9ae6SManikanta Pubbisetty unlock: 8491bc6f9ae6SManikanta Pubbisetty spin_unlock_bh(&ar->data_lock); 8492bc6f9ae6SManikanta Pubbisetty 8493bc6f9ae6SManikanta Pubbisetty if (len >= buf_len) 8494bc6f9ae6SManikanta Pubbisetty buf[len - 1] = 0; 8495bc6f9ae6SManikanta Pubbisetty else 8496bc6f9ae6SManikanta Pubbisetty buf[len] = 0; 8497bc6f9ae6SManikanta Pubbisetty } 8498bc6f9ae6SManikanta Pubbisetty 849962f77f09SMaharaja static struct sk_buff * 850062f77f09SMaharaja ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable, 850162f77f09SMaharaja u32 detect_level, u32 detect_margin) 850262f77f09SMaharaja { 850362f77f09SMaharaja struct wmi_pdev_set_adaptive_cca_params *cmd; 850462f77f09SMaharaja struct sk_buff *skb; 850562f77f09SMaharaja 850662f77f09SMaharaja skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 850762f77f09SMaharaja if (!skb) 850862f77f09SMaharaja return ERR_PTR(-ENOMEM); 850962f77f09SMaharaja 851062f77f09SMaharaja cmd = (struct wmi_pdev_set_adaptive_cca_params *)skb->data; 851162f77f09SMaharaja cmd->enable = __cpu_to_le32(enable); 851262f77f09SMaharaja cmd->cca_detect_level = __cpu_to_le32(detect_level); 851362f77f09SMaharaja cmd->cca_detect_margin = __cpu_to_le32(detect_margin); 851462f77f09SMaharaja 851562f77f09SMaharaja ath10k_dbg(ar, ATH10K_DBG_WMI, 851662f77f09SMaharaja "wmi pdev set adaptive cca params enable:%d detection level:%d detection margin:%d\n", 851762f77f09SMaharaja enable, detect_level, detect_margin); 851862f77f09SMaharaja return skb; 851962f77f09SMaharaja } 852062f77f09SMaharaja 85211b3fdb50SRajkumar Manoharan static void 85221b3fdb50SRajkumar Manoharan ath10k_wmi_fw_vdev_stats_extd_fill(const struct ath10k_fw_stats_vdev_extd *vdev, 85231b3fdb50SRajkumar Manoharan char *buf, u32 *length) 85241b3fdb50SRajkumar Manoharan { 85251b3fdb50SRajkumar Manoharan u32 len = *length; 85261b3fdb50SRajkumar Manoharan u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 85271b3fdb50SRajkumar Manoharan u32 val; 85281b3fdb50SRajkumar Manoharan 85291b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85301b3fdb50SRajkumar Manoharan "vdev id", vdev->vdev_id); 85311b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85321b3fdb50SRajkumar Manoharan "ppdu aggr count", vdev->ppdu_aggr_cnt); 85331b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85341b3fdb50SRajkumar Manoharan "ppdu noack", vdev->ppdu_noack); 85351b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85361b3fdb50SRajkumar Manoharan "mpdu queued", vdev->mpdu_queued); 85371b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85381b3fdb50SRajkumar Manoharan "ppdu nonaggr count", vdev->ppdu_nonaggr_cnt); 85391b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85401b3fdb50SRajkumar Manoharan "mpdu sw requeued", vdev->mpdu_sw_requeued); 85411b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85421b3fdb50SRajkumar Manoharan "mpdu success retry", vdev->mpdu_suc_retry); 85431b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85441b3fdb50SRajkumar Manoharan "mpdu success multitry", vdev->mpdu_suc_multitry); 85451b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85461b3fdb50SRajkumar Manoharan "mpdu fail retry", vdev->mpdu_fail_retry); 85471b3fdb50SRajkumar Manoharan val = vdev->tx_ftm_suc; 85481b3fdb50SRajkumar Manoharan if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 85491b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85501b3fdb50SRajkumar Manoharan "tx ftm success", 85511b3fdb50SRajkumar Manoharan MS(val, WMI_VDEV_STATS_FTM_COUNT)); 85521b3fdb50SRajkumar Manoharan val = vdev->tx_ftm_suc_retry; 85531b3fdb50SRajkumar Manoharan if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 85541b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85551b3fdb50SRajkumar Manoharan "tx ftm success retry", 85561b3fdb50SRajkumar Manoharan MS(val, WMI_VDEV_STATS_FTM_COUNT)); 85571b3fdb50SRajkumar Manoharan val = vdev->tx_ftm_fail; 85581b3fdb50SRajkumar Manoharan if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 85591b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85601b3fdb50SRajkumar Manoharan "tx ftm fail", 85611b3fdb50SRajkumar Manoharan MS(val, WMI_VDEV_STATS_FTM_COUNT)); 85621b3fdb50SRajkumar Manoharan val = vdev->rx_ftmr_cnt; 85631b3fdb50SRajkumar Manoharan if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 85641b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85651b3fdb50SRajkumar Manoharan "rx ftm request count", 85661b3fdb50SRajkumar Manoharan MS(val, WMI_VDEV_STATS_FTM_COUNT)); 85671b3fdb50SRajkumar Manoharan val = vdev->rx_ftmr_dup_cnt; 85681b3fdb50SRajkumar Manoharan if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 85691b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85701b3fdb50SRajkumar Manoharan "rx ftm request dup count", 85711b3fdb50SRajkumar Manoharan MS(val, WMI_VDEV_STATS_FTM_COUNT)); 85721b3fdb50SRajkumar Manoharan val = vdev->rx_iftmr_cnt; 85731b3fdb50SRajkumar Manoharan if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 85741b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85751b3fdb50SRajkumar Manoharan "rx initial ftm req count", 85761b3fdb50SRajkumar Manoharan MS(val, WMI_VDEV_STATS_FTM_COUNT)); 85771b3fdb50SRajkumar Manoharan val = vdev->rx_iftmr_dup_cnt; 85781b3fdb50SRajkumar Manoharan if (val & WMI_VDEV_STATS_FTM_COUNT_VALID) 85791b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "%30s %u\n", 85801b3fdb50SRajkumar Manoharan "rx initial ftm req dup cnt", 85811b3fdb50SRajkumar Manoharan MS(val, WMI_VDEV_STATS_FTM_COUNT)); 85821b3fdb50SRajkumar Manoharan len += scnprintf(buf + len, buf_len - len, "\n"); 85831b3fdb50SRajkumar Manoharan 85841b3fdb50SRajkumar Manoharan *length = len; 85851b3fdb50SRajkumar Manoharan } 85861b3fdb50SRajkumar Manoharan 858798dd2b92SManikanta Pubbisetty void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar, 858898dd2b92SManikanta Pubbisetty struct ath10k_fw_stats *fw_stats, 858998dd2b92SManikanta Pubbisetty char *buf) 859098dd2b92SManikanta Pubbisetty { 859198dd2b92SManikanta Pubbisetty u32 len = 0; 859298dd2b92SManikanta Pubbisetty u32 buf_len = ATH10K_FW_STATS_BUF_SIZE; 859398dd2b92SManikanta Pubbisetty const struct ath10k_fw_stats_pdev *pdev; 85941b3fdb50SRajkumar Manoharan const struct ath10k_fw_stats_vdev_extd *vdev; 859598dd2b92SManikanta Pubbisetty const struct ath10k_fw_stats_peer *peer; 85965c51875cSBalaji Pothunoori const struct ath10k_fw_extd_stats_peer *extd_peer; 859798dd2b92SManikanta Pubbisetty size_t num_peers; 859898dd2b92SManikanta Pubbisetty size_t num_vdevs; 859998dd2b92SManikanta Pubbisetty 860098dd2b92SManikanta Pubbisetty spin_lock_bh(&ar->data_lock); 860198dd2b92SManikanta Pubbisetty 860298dd2b92SManikanta Pubbisetty pdev = list_first_entry_or_null(&fw_stats->pdevs, 860398dd2b92SManikanta Pubbisetty struct ath10k_fw_stats_pdev, list); 860498dd2b92SManikanta Pubbisetty if (!pdev) { 860598dd2b92SManikanta Pubbisetty ath10k_warn(ar, "failed to get pdev stats\n"); 860698dd2b92SManikanta Pubbisetty goto unlock; 860798dd2b92SManikanta Pubbisetty } 860898dd2b92SManikanta Pubbisetty 860998dd2b92SManikanta Pubbisetty num_peers = ath10k_wmi_fw_stats_num_peers(&fw_stats->peers); 861098dd2b92SManikanta Pubbisetty num_vdevs = ath10k_wmi_fw_stats_num_vdevs(&fw_stats->vdevs); 861198dd2b92SManikanta Pubbisetty 861298dd2b92SManikanta Pubbisetty ath10k_wmi_fw_pdev_base_stats_fill(pdev, buf, &len); 861398dd2b92SManikanta Pubbisetty ath10k_wmi_fw_pdev_extra_stats_fill(pdev, buf, &len); 861498dd2b92SManikanta Pubbisetty ath10k_wmi_fw_pdev_tx_stats_fill(pdev, buf, &len); 861598dd2b92SManikanta Pubbisetty 861698dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 861798dd2b92SManikanta Pubbisetty "HW paused", pdev->hw_paused); 861898dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 861998dd2b92SManikanta Pubbisetty "Seqs posted", pdev->seq_posted); 862098dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 862198dd2b92SManikanta Pubbisetty "Seqs failed queueing", pdev->seq_failed_queueing); 862298dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 862398dd2b92SManikanta Pubbisetty "Seqs completed", pdev->seq_completed); 862498dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 862598dd2b92SManikanta Pubbisetty "Seqs restarted", pdev->seq_restarted); 862698dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 862798dd2b92SManikanta Pubbisetty "MU Seqs posted", pdev->mu_seq_posted); 862898dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 862998dd2b92SManikanta Pubbisetty "MPDUs SW flushed", pdev->mpdus_sw_flush); 863098dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 863198dd2b92SManikanta Pubbisetty "MPDUs HW filtered", pdev->mpdus_hw_filter); 863298dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 863398dd2b92SManikanta Pubbisetty "MPDUs truncated", pdev->mpdus_truncated); 863498dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 863598dd2b92SManikanta Pubbisetty "MPDUs receive no ACK", pdev->mpdus_ack_failed); 863698dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 863798dd2b92SManikanta Pubbisetty "MPDUs expired", pdev->mpdus_expired); 863898dd2b92SManikanta Pubbisetty 863998dd2b92SManikanta Pubbisetty ath10k_wmi_fw_pdev_rx_stats_fill(pdev, buf, &len); 864098dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s %10d\n", 864198dd2b92SManikanta Pubbisetty "Num Rx Overflow errors", pdev->rx_ovfl_errs); 864298dd2b92SManikanta Pubbisetty 864398dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 864498dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 864598dd2b92SManikanta Pubbisetty "ath10k VDEV stats", num_vdevs); 864698dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 864798dd2b92SManikanta Pubbisetty "================="); 864898dd2b92SManikanta Pubbisetty list_for_each_entry(vdev, &fw_stats->vdevs, list) { 86491b3fdb50SRajkumar Manoharan ath10k_wmi_fw_vdev_stats_extd_fill(vdev, buf, &len); 865098dd2b92SManikanta Pubbisetty } 865198dd2b92SManikanta Pubbisetty 865298dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "\n"); 865398dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 865498dd2b92SManikanta Pubbisetty "ath10k PEER stats", num_peers); 865598dd2b92SManikanta Pubbisetty len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 865698dd2b92SManikanta Pubbisetty "================="); 865798dd2b92SManikanta Pubbisetty 865898dd2b92SManikanta Pubbisetty list_for_each_entry(peer, &fw_stats->peers, list) { 86595c51875cSBalaji Pothunoori ath10k_wmi_fw_peer_stats_fill(peer, buf, &len, 86605c51875cSBalaji Pothunoori fw_stats->extended); 86615c51875cSBalaji Pothunoori } 86625c51875cSBalaji Pothunoori 86635c51875cSBalaji Pothunoori if (fw_stats->extended) { 86645c51875cSBalaji Pothunoori list_for_each_entry(extd_peer, &fw_stats->peers_extd, list) { 86655c51875cSBalaji Pothunoori ath10k_wmi_fw_extd_peer_stats_fill(extd_peer, buf, 86665c51875cSBalaji Pothunoori &len); 86675c51875cSBalaji Pothunoori } 866898dd2b92SManikanta Pubbisetty } 866998dd2b92SManikanta Pubbisetty 867098dd2b92SManikanta Pubbisetty unlock: 867198dd2b92SManikanta Pubbisetty spin_unlock_bh(&ar->data_lock); 867298dd2b92SManikanta Pubbisetty 867398dd2b92SManikanta Pubbisetty if (len >= buf_len) 867498dd2b92SManikanta Pubbisetty buf[len - 1] = 0; 867598dd2b92SManikanta Pubbisetty else 867698dd2b92SManikanta Pubbisetty buf[len] = 0; 867798dd2b92SManikanta Pubbisetty } 867898dd2b92SManikanta Pubbisetty 86796e4de1a4SPeter Oh int ath10k_wmi_op_get_vdev_subtype(struct ath10k *ar, 86806e4de1a4SPeter Oh enum wmi_vdev_subtype subtype) 86816e4de1a4SPeter Oh { 86826e4de1a4SPeter Oh switch (subtype) { 86836e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_NONE: 86846e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_LEGACY_NONE; 86856e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_DEVICE: 86866e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_LEGACY_P2P_DEV; 86876e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_CLIENT: 86886e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_LEGACY_P2P_CLI; 86896e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_GO: 86906e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_LEGACY_P2P_GO; 86916e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_PROXY_STA: 86926e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_LEGACY_PROXY_STA; 86936e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_MESH_11S: 86946e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_MESH_NON_11S: 86956e4de1a4SPeter Oh return -ENOTSUPP; 86966e4de1a4SPeter Oh } 86976e4de1a4SPeter Oh return -ENOTSUPP; 86986e4de1a4SPeter Oh } 86996e4de1a4SPeter Oh 87006e4de1a4SPeter Oh static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k *ar, 87016e4de1a4SPeter Oh enum wmi_vdev_subtype subtype) 87026e4de1a4SPeter Oh { 87036e4de1a4SPeter Oh switch (subtype) { 87046e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_NONE: 87056e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_2_4_NONE; 87066e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_DEVICE: 87076e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_2_4_P2P_DEV; 87086e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_CLIENT: 87096e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_2_4_P2P_CLI; 87106e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_GO: 87116e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_2_4_P2P_GO; 87126e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_PROXY_STA: 87136e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_2_4_PROXY_STA; 87146e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_MESH_11S: 87156e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_2_4_MESH_11S; 87166e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_MESH_NON_11S: 87176e4de1a4SPeter Oh return -ENOTSUPP; 87186e4de1a4SPeter Oh } 87196e4de1a4SPeter Oh return -ENOTSUPP; 87206e4de1a4SPeter Oh } 87216e4de1a4SPeter Oh 87226e4de1a4SPeter Oh static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k *ar, 87236e4de1a4SPeter Oh enum wmi_vdev_subtype subtype) 87246e4de1a4SPeter Oh { 87256e4de1a4SPeter Oh switch (subtype) { 87266e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_NONE: 87276e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_4_NONE; 87286e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_DEVICE: 87296e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_4_P2P_DEV; 87306e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_CLIENT: 87316e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_4_P2P_CLI; 87326e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_P2P_GO: 87336e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_4_P2P_GO; 87346e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_PROXY_STA: 87356e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_4_PROXY_STA; 87366e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_MESH_11S: 87376e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_4_MESH_11S; 87386e4de1a4SPeter Oh case WMI_VDEV_SUBTYPE_MESH_NON_11S: 87396e4de1a4SPeter Oh return WMI_VDEV_SUBTYPE_10_4_MESH_NON_11S; 87406e4de1a4SPeter Oh } 87416e4de1a4SPeter Oh return -ENOTSUPP; 87426e4de1a4SPeter Oh } 87436e4de1a4SPeter Oh 874447771902SRaja Mani static struct sk_buff * 874547771902SRaja Mani ath10k_wmi_10_4_ext_resource_config(struct ath10k *ar, 874647771902SRaja Mani enum wmi_host_platform_type type, 874747771902SRaja Mani u32 fw_feature_bitmap) 874847771902SRaja Mani { 874947771902SRaja Mani struct wmi_ext_resource_config_10_4_cmd *cmd; 875047771902SRaja Mani struct sk_buff *skb; 8751add6cd8dSManikanta Pubbisetty u32 num_tdls_sleep_sta = 0; 875247771902SRaja Mani 875347771902SRaja Mani skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 875447771902SRaja Mani if (!skb) 875547771902SRaja Mani return ERR_PTR(-ENOMEM); 875647771902SRaja Mani 8757add6cd8dSManikanta Pubbisetty if (test_bit(WMI_SERVICE_TDLS_UAPSD_SLEEP_STA, ar->wmi.svc_map)) 8758add6cd8dSManikanta Pubbisetty num_tdls_sleep_sta = TARGET_10_4_NUM_TDLS_SLEEP_STA; 8759add6cd8dSManikanta Pubbisetty 876047771902SRaja Mani cmd = (struct wmi_ext_resource_config_10_4_cmd *)skb->data; 876147771902SRaja Mani cmd->host_platform_config = __cpu_to_le32(type); 876247771902SRaja Mani cmd->fw_feature_bitmap = __cpu_to_le32(fw_feature_bitmap); 8763add6cd8dSManikanta Pubbisetty cmd->wlan_gpio_priority = __cpu_to_le32(-1); 8764add6cd8dSManikanta Pubbisetty cmd->coex_version = __cpu_to_le32(WMI_NO_COEX_VERSION_SUPPORT); 8765add6cd8dSManikanta Pubbisetty cmd->coex_gpio_pin1 = __cpu_to_le32(-1); 8766add6cd8dSManikanta Pubbisetty cmd->coex_gpio_pin2 = __cpu_to_le32(-1); 8767add6cd8dSManikanta Pubbisetty cmd->coex_gpio_pin3 = __cpu_to_le32(-1); 8768add6cd8dSManikanta Pubbisetty cmd->num_tdls_vdevs = __cpu_to_le32(TARGET_10_4_NUM_TDLS_VDEVS); 8769add6cd8dSManikanta Pubbisetty cmd->num_tdls_conn_table_entries = __cpu_to_le32(20); 8770add6cd8dSManikanta Pubbisetty cmd->max_tdls_concurrent_sleep_sta = __cpu_to_le32(num_tdls_sleep_sta); 8771add6cd8dSManikanta Pubbisetty cmd->max_tdls_concurrent_buffer_sta = 8772add6cd8dSManikanta Pubbisetty __cpu_to_le32(TARGET_10_4_NUM_TDLS_BUFFER_STA); 877347771902SRaja Mani 877447771902SRaja Mani ath10k_dbg(ar, ATH10K_DBG_WMI, 877547771902SRaja Mani "wmi ext resource config host type %d firmware feature bitmap %08x\n", 877647771902SRaja Mani type, fw_feature_bitmap); 877747771902SRaja Mani return skb; 877847771902SRaja Mani } 877947771902SRaja Mani 8780e25854f2SMichal Kazior static struct sk_buff * 8781add6cd8dSManikanta Pubbisetty ath10k_wmi_10_4_gen_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id, 8782add6cd8dSManikanta Pubbisetty enum wmi_tdls_state state) 8783add6cd8dSManikanta Pubbisetty { 8784add6cd8dSManikanta Pubbisetty struct wmi_10_4_tdls_set_state_cmd *cmd; 8785add6cd8dSManikanta Pubbisetty struct sk_buff *skb; 8786add6cd8dSManikanta Pubbisetty u32 options = 0; 8787add6cd8dSManikanta Pubbisetty 8788add6cd8dSManikanta Pubbisetty skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8789add6cd8dSManikanta Pubbisetty if (!skb) 8790add6cd8dSManikanta Pubbisetty return ERR_PTR(-ENOMEM); 8791add6cd8dSManikanta Pubbisetty 8792e5b6853eSAnilkumar Kolli if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map) && 8793e5b6853eSAnilkumar Kolli state == WMI_TDLS_ENABLE_ACTIVE) 8794add6cd8dSManikanta Pubbisetty state = WMI_TDLS_ENABLE_PASSIVE; 8795add6cd8dSManikanta Pubbisetty 8796add6cd8dSManikanta Pubbisetty if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map)) 8797add6cd8dSManikanta Pubbisetty options |= WMI_TDLS_BUFFER_STA_EN; 8798add6cd8dSManikanta Pubbisetty 8799add6cd8dSManikanta Pubbisetty cmd = (struct wmi_10_4_tdls_set_state_cmd *)skb->data; 8800add6cd8dSManikanta Pubbisetty cmd->vdev_id = __cpu_to_le32(vdev_id); 8801add6cd8dSManikanta Pubbisetty cmd->state = __cpu_to_le32(state); 8802add6cd8dSManikanta Pubbisetty cmd->notification_interval_ms = __cpu_to_le32(5000); 8803add6cd8dSManikanta Pubbisetty cmd->tx_discovery_threshold = __cpu_to_le32(100); 8804add6cd8dSManikanta Pubbisetty cmd->tx_teardown_threshold = __cpu_to_le32(5); 8805add6cd8dSManikanta Pubbisetty cmd->rssi_teardown_threshold = __cpu_to_le32(-75); 8806add6cd8dSManikanta Pubbisetty cmd->rssi_delta = __cpu_to_le32(-20); 8807add6cd8dSManikanta Pubbisetty cmd->tdls_options = __cpu_to_le32(options); 8808add6cd8dSManikanta Pubbisetty cmd->tdls_peer_traffic_ind_window = __cpu_to_le32(2); 8809add6cd8dSManikanta Pubbisetty cmd->tdls_peer_traffic_response_timeout_ms = __cpu_to_le32(5000); 8810add6cd8dSManikanta Pubbisetty cmd->tdls_puapsd_mask = __cpu_to_le32(0xf); 8811add6cd8dSManikanta Pubbisetty cmd->tdls_puapsd_inactivity_time_ms = __cpu_to_le32(0); 8812add6cd8dSManikanta Pubbisetty cmd->tdls_puapsd_rx_frame_threshold = __cpu_to_le32(10); 8813add6cd8dSManikanta Pubbisetty cmd->teardown_notification_ms = __cpu_to_le32(10); 8814add6cd8dSManikanta Pubbisetty cmd->tdls_peer_kickout_threshold = __cpu_to_le32(96); 8815add6cd8dSManikanta Pubbisetty 8816add6cd8dSManikanta Pubbisetty ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi update fw tdls state %d for vdev %i\n", 8817add6cd8dSManikanta Pubbisetty state, vdev_id); 8818add6cd8dSManikanta Pubbisetty return skb; 8819add6cd8dSManikanta Pubbisetty } 8820add6cd8dSManikanta Pubbisetty 8821add6cd8dSManikanta Pubbisetty static u32 ath10k_wmi_prepare_peer_qos(u8 uapsd_queues, u8 sp) 8822add6cd8dSManikanta Pubbisetty { 8823add6cd8dSManikanta Pubbisetty u32 peer_qos = 0; 8824add6cd8dSManikanta Pubbisetty 8825add6cd8dSManikanta Pubbisetty if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO) 8826add6cd8dSManikanta Pubbisetty peer_qos |= WMI_TDLS_PEER_QOS_AC_VO; 8827add6cd8dSManikanta Pubbisetty if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI) 8828add6cd8dSManikanta Pubbisetty peer_qos |= WMI_TDLS_PEER_QOS_AC_VI; 8829add6cd8dSManikanta Pubbisetty if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK) 8830add6cd8dSManikanta Pubbisetty peer_qos |= WMI_TDLS_PEER_QOS_AC_BK; 8831add6cd8dSManikanta Pubbisetty if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE) 8832add6cd8dSManikanta Pubbisetty peer_qos |= WMI_TDLS_PEER_QOS_AC_BE; 8833add6cd8dSManikanta Pubbisetty 8834add6cd8dSManikanta Pubbisetty peer_qos |= SM(sp, WMI_TDLS_PEER_SP); 8835add6cd8dSManikanta Pubbisetty 8836add6cd8dSManikanta Pubbisetty return peer_qos; 8837add6cd8dSManikanta Pubbisetty } 8838add6cd8dSManikanta Pubbisetty 8839add6cd8dSManikanta Pubbisetty static struct sk_buff * 8840bc64d052SMaharaja Kennadyrajan ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid(struct ath10k *ar, u32 param) 8841bc64d052SMaharaja Kennadyrajan { 8842bc64d052SMaharaja Kennadyrajan struct wmi_pdev_get_tpc_table_cmd *cmd; 8843bc64d052SMaharaja Kennadyrajan struct sk_buff *skb; 8844bc64d052SMaharaja Kennadyrajan 8845bc64d052SMaharaja Kennadyrajan skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8846bc64d052SMaharaja Kennadyrajan if (!skb) 8847bc64d052SMaharaja Kennadyrajan return ERR_PTR(-ENOMEM); 8848bc64d052SMaharaja Kennadyrajan 8849bc64d052SMaharaja Kennadyrajan cmd = (struct wmi_pdev_get_tpc_table_cmd *)skb->data; 8850bc64d052SMaharaja Kennadyrajan cmd->param = __cpu_to_le32(param); 8851bc64d052SMaharaja Kennadyrajan 8852bc64d052SMaharaja Kennadyrajan ath10k_dbg(ar, ATH10K_DBG_WMI, 8853bc64d052SMaharaja Kennadyrajan "wmi pdev get tpc table param:%d\n", param); 8854bc64d052SMaharaja Kennadyrajan return skb; 8855bc64d052SMaharaja Kennadyrajan } 8856bc64d052SMaharaja Kennadyrajan 8857bc64d052SMaharaja Kennadyrajan static struct sk_buff * 8858add6cd8dSManikanta Pubbisetty ath10k_wmi_10_4_gen_tdls_peer_update(struct ath10k *ar, 8859add6cd8dSManikanta Pubbisetty const struct wmi_tdls_peer_update_cmd_arg *arg, 8860add6cd8dSManikanta Pubbisetty const struct wmi_tdls_peer_capab_arg *cap, 8861add6cd8dSManikanta Pubbisetty const struct wmi_channel_arg *chan_arg) 8862add6cd8dSManikanta Pubbisetty { 8863add6cd8dSManikanta Pubbisetty struct wmi_10_4_tdls_peer_update_cmd *cmd; 8864add6cd8dSManikanta Pubbisetty struct wmi_tdls_peer_capabilities *peer_cap; 8865add6cd8dSManikanta Pubbisetty struct wmi_channel *chan; 8866add6cd8dSManikanta Pubbisetty struct sk_buff *skb; 8867add6cd8dSManikanta Pubbisetty u32 peer_qos; 8868add6cd8dSManikanta Pubbisetty int len, chan_len; 8869add6cd8dSManikanta Pubbisetty int i; 8870add6cd8dSManikanta Pubbisetty 8871add6cd8dSManikanta Pubbisetty /* tdls peer update cmd has place holder for one channel*/ 8872add6cd8dSManikanta Pubbisetty chan_len = cap->peer_chan_len ? (cap->peer_chan_len - 1) : 0; 8873add6cd8dSManikanta Pubbisetty 8874add6cd8dSManikanta Pubbisetty len = sizeof(*cmd) + chan_len * sizeof(*chan); 8875add6cd8dSManikanta Pubbisetty 8876add6cd8dSManikanta Pubbisetty skb = ath10k_wmi_alloc_skb(ar, len); 8877add6cd8dSManikanta Pubbisetty if (!skb) 8878add6cd8dSManikanta Pubbisetty return ERR_PTR(-ENOMEM); 8879add6cd8dSManikanta Pubbisetty 8880add6cd8dSManikanta Pubbisetty memset(skb->data, 0, sizeof(*cmd)); 8881add6cd8dSManikanta Pubbisetty 8882add6cd8dSManikanta Pubbisetty cmd = (struct wmi_10_4_tdls_peer_update_cmd *)skb->data; 8883add6cd8dSManikanta Pubbisetty cmd->vdev_id = __cpu_to_le32(arg->vdev_id); 8884add6cd8dSManikanta Pubbisetty ether_addr_copy(cmd->peer_macaddr.addr, arg->addr); 8885add6cd8dSManikanta Pubbisetty cmd->peer_state = __cpu_to_le32(arg->peer_state); 8886add6cd8dSManikanta Pubbisetty 8887add6cd8dSManikanta Pubbisetty peer_qos = ath10k_wmi_prepare_peer_qos(cap->peer_uapsd_queues, 8888add6cd8dSManikanta Pubbisetty cap->peer_max_sp); 8889add6cd8dSManikanta Pubbisetty 8890add6cd8dSManikanta Pubbisetty peer_cap = &cmd->peer_capab; 8891add6cd8dSManikanta Pubbisetty peer_cap->peer_qos = __cpu_to_le32(peer_qos); 8892add6cd8dSManikanta Pubbisetty peer_cap->buff_sta_support = __cpu_to_le32(cap->buff_sta_support); 8893add6cd8dSManikanta Pubbisetty peer_cap->off_chan_support = __cpu_to_le32(cap->off_chan_support); 8894add6cd8dSManikanta Pubbisetty peer_cap->peer_curr_operclass = __cpu_to_le32(cap->peer_curr_operclass); 8895add6cd8dSManikanta Pubbisetty peer_cap->self_curr_operclass = __cpu_to_le32(cap->self_curr_operclass); 8896add6cd8dSManikanta Pubbisetty peer_cap->peer_chan_len = __cpu_to_le32(cap->peer_chan_len); 8897add6cd8dSManikanta Pubbisetty peer_cap->peer_operclass_len = __cpu_to_le32(cap->peer_operclass_len); 8898add6cd8dSManikanta Pubbisetty 8899add6cd8dSManikanta Pubbisetty for (i = 0; i < WMI_TDLS_MAX_SUPP_OPER_CLASSES; i++) 8900add6cd8dSManikanta Pubbisetty peer_cap->peer_operclass[i] = cap->peer_operclass[i]; 8901add6cd8dSManikanta Pubbisetty 8902add6cd8dSManikanta Pubbisetty peer_cap->is_peer_responder = __cpu_to_le32(cap->is_peer_responder); 8903add6cd8dSManikanta Pubbisetty peer_cap->pref_offchan_num = __cpu_to_le32(cap->pref_offchan_num); 8904add6cd8dSManikanta Pubbisetty peer_cap->pref_offchan_bw = __cpu_to_le32(cap->pref_offchan_bw); 8905add6cd8dSManikanta Pubbisetty 8906add6cd8dSManikanta Pubbisetty for (i = 0; i < cap->peer_chan_len; i++) { 8907add6cd8dSManikanta Pubbisetty chan = (struct wmi_channel *)&peer_cap->peer_chan_list[i]; 8908add6cd8dSManikanta Pubbisetty ath10k_wmi_put_wmi_channel(chan, &chan_arg[i]); 8909add6cd8dSManikanta Pubbisetty } 8910add6cd8dSManikanta Pubbisetty 8911add6cd8dSManikanta Pubbisetty ath10k_dbg(ar, ATH10K_DBG_WMI, 8912add6cd8dSManikanta Pubbisetty "wmi tdls peer update vdev %i state %d n_chans %u\n", 8913add6cd8dSManikanta Pubbisetty arg->vdev_id, arg->peer_state, cap->peer_chan_len); 8914add6cd8dSManikanta Pubbisetty return skb; 8915add6cd8dSManikanta Pubbisetty } 8916add6cd8dSManikanta Pubbisetty 8917add6cd8dSManikanta Pubbisetty static struct sk_buff * 89186f6eb1bcSSriram R ath10k_wmi_10_4_gen_radar_found(struct ath10k *ar, 89196f6eb1bcSSriram R const struct ath10k_radar_found_info *arg) 89206f6eb1bcSSriram R { 89216f6eb1bcSSriram R struct wmi_radar_found_info *cmd; 89226f6eb1bcSSriram R struct sk_buff *skb; 89236f6eb1bcSSriram R 89246f6eb1bcSSriram R skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 89256f6eb1bcSSriram R if (!skb) 89266f6eb1bcSSriram R return ERR_PTR(-ENOMEM); 89276f6eb1bcSSriram R 89286f6eb1bcSSriram R cmd = (struct wmi_radar_found_info *)skb->data; 89296f6eb1bcSSriram R cmd->pri_min = __cpu_to_le32(arg->pri_min); 89306f6eb1bcSSriram R cmd->pri_max = __cpu_to_le32(arg->pri_max); 89316f6eb1bcSSriram R cmd->width_min = __cpu_to_le32(arg->width_min); 89326f6eb1bcSSriram R cmd->width_max = __cpu_to_le32(arg->width_max); 89336f6eb1bcSSriram R cmd->sidx_min = __cpu_to_le32(arg->sidx_min); 89346f6eb1bcSSriram R cmd->sidx_max = __cpu_to_le32(arg->sidx_max); 89356f6eb1bcSSriram R 89366f6eb1bcSSriram R ath10k_dbg(ar, ATH10K_DBG_WMI, 89376f6eb1bcSSriram R "wmi radar found pri_min %d pri_max %d width_min %d width_max %d sidx_min %d sidx_max %d\n", 89386f6eb1bcSSriram R arg->pri_min, arg->pri_max, arg->width_min, 89396f6eb1bcSSriram R arg->width_max, arg->sidx_min, arg->sidx_max); 89406f6eb1bcSSriram R return skb; 89416f6eb1bcSSriram R } 89426f6eb1bcSSriram R 89436f6eb1bcSSriram R static struct sk_buff * 8944e25854f2SMichal Kazior ath10k_wmi_op_gen_echo(struct ath10k *ar, u32 value) 8945e25854f2SMichal Kazior { 8946e25854f2SMichal Kazior struct wmi_echo_cmd *cmd; 8947e25854f2SMichal Kazior struct sk_buff *skb; 8948e25854f2SMichal Kazior 8949e25854f2SMichal Kazior skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 8950e25854f2SMichal Kazior if (!skb) 8951e25854f2SMichal Kazior return ERR_PTR(-ENOMEM); 8952e25854f2SMichal Kazior 8953e25854f2SMichal Kazior cmd = (struct wmi_echo_cmd *)skb->data; 8954e25854f2SMichal Kazior cmd->value = cpu_to_le32(value); 8955e25854f2SMichal Kazior 8956e25854f2SMichal Kazior ath10k_dbg(ar, ATH10K_DBG_WMI, 8957e25854f2SMichal Kazior "wmi echo value 0x%08x\n", value); 8958e25854f2SMichal Kazior return skb; 8959e25854f2SMichal Kazior } 8960e25854f2SMichal Kazior 896120ddca21SMichal Kazior int 896220ddca21SMichal Kazior ath10k_wmi_barrier(struct ath10k *ar) 896320ddca21SMichal Kazior { 896420ddca21SMichal Kazior int ret; 896520ddca21SMichal Kazior int time_left; 896620ddca21SMichal Kazior 896720ddca21SMichal Kazior spin_lock_bh(&ar->data_lock); 896820ddca21SMichal Kazior reinit_completion(&ar->wmi.barrier); 896920ddca21SMichal Kazior spin_unlock_bh(&ar->data_lock); 897020ddca21SMichal Kazior 897120ddca21SMichal Kazior ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID); 897220ddca21SMichal Kazior if (ret) { 897320ddca21SMichal Kazior ath10k_warn(ar, "failed to submit wmi echo: %d\n", ret); 897420ddca21SMichal Kazior return ret; 897520ddca21SMichal Kazior } 897620ddca21SMichal Kazior 897720ddca21SMichal Kazior time_left = wait_for_completion_timeout(&ar->wmi.barrier, 897820ddca21SMichal Kazior ATH10K_WMI_BARRIER_TIMEOUT_HZ); 897920ddca21SMichal Kazior if (!time_left) 898020ddca21SMichal Kazior return -ETIMEDOUT; 898120ddca21SMichal Kazior 898220ddca21SMichal Kazior return 0; 898320ddca21SMichal Kazior } 898420ddca21SMichal Kazior 898584758d4dSBhagavathi Perumal S static struct sk_buff * 898684758d4dSBhagavathi Perumal S ath10k_wmi_10_2_4_op_gen_bb_timing(struct ath10k *ar, 898784758d4dSBhagavathi Perumal S const struct wmi_bb_timing_cfg_arg *arg) 898884758d4dSBhagavathi Perumal S { 898984758d4dSBhagavathi Perumal S struct wmi_pdev_bb_timing_cfg_cmd *cmd; 899084758d4dSBhagavathi Perumal S struct sk_buff *skb; 899184758d4dSBhagavathi Perumal S 899284758d4dSBhagavathi Perumal S skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd)); 899384758d4dSBhagavathi Perumal S if (!skb) 899484758d4dSBhagavathi Perumal S return ERR_PTR(-ENOMEM); 899584758d4dSBhagavathi Perumal S 899684758d4dSBhagavathi Perumal S cmd = (struct wmi_pdev_bb_timing_cfg_cmd *)skb->data; 899784758d4dSBhagavathi Perumal S cmd->bb_tx_timing = __cpu_to_le32(arg->bb_tx_timing); 899884758d4dSBhagavathi Perumal S cmd->bb_xpa_timing = __cpu_to_le32(arg->bb_xpa_timing); 899984758d4dSBhagavathi Perumal S 900084758d4dSBhagavathi Perumal S ath10k_dbg(ar, ATH10K_DBG_WMI, 900184758d4dSBhagavathi Perumal S "wmi pdev bb_tx_timing 0x%x bb_xpa_timing 0x%x\n", 900284758d4dSBhagavathi Perumal S arg->bb_tx_timing, arg->bb_xpa_timing); 900384758d4dSBhagavathi Perumal S return skb; 900484758d4dSBhagavathi Perumal S } 900584758d4dSBhagavathi Perumal S 9006d7579d12SMichal Kazior static const struct wmi_ops wmi_ops = { 9007d7579d12SMichal Kazior .rx = ath10k_wmi_op_rx, 9008d7579d12SMichal Kazior .map_svc = wmi_main_svc_map, 9009d7579d12SMichal Kazior 9010d7579d12SMichal Kazior .pull_scan = ath10k_wmi_op_pull_scan_ev, 9011d7579d12SMichal Kazior .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 9012d7579d12SMichal Kazior .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 9013d7579d12SMichal Kazior .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9014d7579d12SMichal Kazior .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9015d7579d12SMichal Kazior .pull_swba = ath10k_wmi_op_pull_swba_ev, 9016991adf71SRaja Mani .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 9017d7579d12SMichal Kazior .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 9018d7579d12SMichal Kazior .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev, 9019d7579d12SMichal Kazior .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9020d7579d12SMichal Kazior .pull_fw_stats = ath10k_wmi_main_op_pull_fw_stats, 9021c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 902284d4911bSMichal Kazior .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9023d7579d12SMichal Kazior 9024d7579d12SMichal Kazior .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9025d7579d12SMichal Kazior .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9026d7579d12SMichal Kazior .gen_pdev_set_rd = ath10k_wmi_op_gen_pdev_set_rd, 9027d7579d12SMichal Kazior .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9028d7579d12SMichal Kazior .gen_init = ath10k_wmi_op_gen_init, 9029d7579d12SMichal Kazior .gen_start_scan = ath10k_wmi_op_gen_start_scan, 9030d7579d12SMichal Kazior .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9031d7579d12SMichal Kazior .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9032d7579d12SMichal Kazior .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9033d7579d12SMichal Kazior .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9034d7579d12SMichal Kazior .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9035d7579d12SMichal Kazior .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9036d7579d12SMichal Kazior .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9037d7579d12SMichal Kazior .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9038d7579d12SMichal Kazior .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9039d7579d12SMichal Kazior .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9040d7579d12SMichal Kazior .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 90416d492fe2SMichal Kazior /* .gen_vdev_wmm_conf not implemented */ 9042d7579d12SMichal Kazior .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9043d7579d12SMichal Kazior .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9044d7579d12SMichal Kazior .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9045d7579d12SMichal Kazior .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9046d7579d12SMichal Kazior .gen_peer_assoc = ath10k_wmi_op_gen_peer_assoc, 9047d7579d12SMichal Kazior .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9048d7579d12SMichal Kazior .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9049d7579d12SMichal Kazior .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9050d7579d12SMichal Kazior .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9051d7579d12SMichal Kazior .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9052d7579d12SMichal Kazior .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9053d7579d12SMichal Kazior .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9054d7579d12SMichal Kazior .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9055d7579d12SMichal Kazior .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9056d7579d12SMichal Kazior .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 9057d7579d12SMichal Kazior .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9058d7579d12SMichal Kazior .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9059ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9060a57a6a27SRajkumar Manoharan /* .gen_pdev_get_temperature not implemented */ 9061dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 906265c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 906311597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 906450abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9065bc6f9ae6SManikanta Pubbisetty .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill, 90666e4de1a4SPeter Oh .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, 9067e25854f2SMichal Kazior .gen_echo = ath10k_wmi_op_gen_echo, 9068be9ce9d8SMichal Kazior /* .gen_bcn_tmpl not implemented */ 90694c4955feSMichal Kazior /* .gen_prb_tmpl not implemented */ 9070369242b4SMichal Kazior /* .gen_p2p_go_bcn_ie not implemented */ 90715b272e30SMichal Kazior /* .gen_adaptive_qcs not implemented */ 907262f77f09SMaharaja /* .gen_pdev_enable_adaptive_cca not implemented */ 9073d7579d12SMichal Kazior }; 9074d7579d12SMichal Kazior 9075d7579d12SMichal Kazior static const struct wmi_ops wmi_10_1_ops = { 9076d7579d12SMichal Kazior .rx = ath10k_wmi_10_1_op_rx, 9077d7579d12SMichal Kazior .map_svc = wmi_10x_svc_map, 9078d7579d12SMichal Kazior .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 9079d7579d12SMichal Kazior .pull_fw_stats = ath10k_wmi_10x_op_pull_fw_stats, 9080d7579d12SMichal Kazior .gen_init = ath10k_wmi_10_1_op_gen_init, 9081d7579d12SMichal Kazior .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 9082d7579d12SMichal Kazior .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 9083d7579d12SMichal Kazior .gen_peer_assoc = ath10k_wmi_10_1_op_gen_peer_assoc, 9084a57a6a27SRajkumar Manoharan /* .gen_pdev_get_temperature not implemented */ 9085d7579d12SMichal Kazior 9086d7579d12SMichal Kazior /* shared with main branch */ 9087d7579d12SMichal Kazior .pull_scan = ath10k_wmi_op_pull_scan_ev, 9088d7579d12SMichal Kazior .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 9089d7579d12SMichal Kazior .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 9090d7579d12SMichal Kazior .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9091d7579d12SMichal Kazior .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9092d7579d12SMichal Kazior .pull_swba = ath10k_wmi_op_pull_swba_ev, 9093991adf71SRaja Mani .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 9094d7579d12SMichal Kazior .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 9095d7579d12SMichal Kazior .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9096c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 909784d4911bSMichal Kazior .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9098d7579d12SMichal Kazior 9099d7579d12SMichal Kazior .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9100d7579d12SMichal Kazior .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9101d7579d12SMichal Kazior .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9102d7579d12SMichal Kazior .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9103d7579d12SMichal Kazior .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9104d7579d12SMichal Kazior .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9105d7579d12SMichal Kazior .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9106d7579d12SMichal Kazior .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9107d7579d12SMichal Kazior .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9108d7579d12SMichal Kazior .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9109d7579d12SMichal Kazior .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9110d7579d12SMichal Kazior .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9111d7579d12SMichal Kazior .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9112d7579d12SMichal Kazior .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 91136d492fe2SMichal Kazior /* .gen_vdev_wmm_conf not implemented */ 9114d7579d12SMichal Kazior .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9115d7579d12SMichal Kazior .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9116d7579d12SMichal Kazior .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9117d7579d12SMichal Kazior .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9118d7579d12SMichal Kazior .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9119d7579d12SMichal Kazior .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9120d7579d12SMichal Kazior .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9121d7579d12SMichal Kazior .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9122d7579d12SMichal Kazior .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9123d7579d12SMichal Kazior .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9124d7579d12SMichal Kazior .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9125d7579d12SMichal Kazior .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9126d7579d12SMichal Kazior .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9127d7579d12SMichal Kazior .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 9128d7579d12SMichal Kazior .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9129d7579d12SMichal Kazior .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9130ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9131dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 913265c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 913311597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 913450abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9135bc6f9ae6SManikanta Pubbisetty .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, 91366e4de1a4SPeter Oh .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, 9137e25854f2SMichal Kazior .gen_echo = ath10k_wmi_op_gen_echo, 9138be9ce9d8SMichal Kazior /* .gen_bcn_tmpl not implemented */ 91394c4955feSMichal Kazior /* .gen_prb_tmpl not implemented */ 9140369242b4SMichal Kazior /* .gen_p2p_go_bcn_ie not implemented */ 91415b272e30SMichal Kazior /* .gen_adaptive_qcs not implemented */ 914262f77f09SMaharaja /* .gen_pdev_enable_adaptive_cca not implemented */ 9143d7579d12SMichal Kazior }; 9144d7579d12SMichal Kazior 9145d7579d12SMichal Kazior static const struct wmi_ops wmi_10_2_ops = { 9146d7579d12SMichal Kazior .rx = ath10k_wmi_10_2_op_rx, 914720de2229SMichal Kazior .pull_fw_stats = ath10k_wmi_10_2_op_pull_fw_stats, 9148d7579d12SMichal Kazior .gen_init = ath10k_wmi_10_2_op_gen_init, 9149d7579d12SMichal Kazior .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc, 9150a57a6a27SRajkumar Manoharan /* .gen_pdev_get_temperature not implemented */ 9151d7579d12SMichal Kazior 9152d7579d12SMichal Kazior /* shared with 10.1 */ 9153d7579d12SMichal Kazior .map_svc = wmi_10x_svc_map, 9154d7579d12SMichal Kazior .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 9155d7579d12SMichal Kazior .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 9156d7579d12SMichal Kazior .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 9157e25854f2SMichal Kazior .gen_echo = ath10k_wmi_op_gen_echo, 9158d7579d12SMichal Kazior 9159d7579d12SMichal Kazior .pull_scan = ath10k_wmi_op_pull_scan_ev, 9160d7579d12SMichal Kazior .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 9161d7579d12SMichal Kazior .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 9162d7579d12SMichal Kazior .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9163d7579d12SMichal Kazior .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 9164d7579d12SMichal Kazior .pull_swba = ath10k_wmi_op_pull_swba_ev, 9165991adf71SRaja Mani .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 9166d7579d12SMichal Kazior .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 9167d7579d12SMichal Kazior .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9168c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 916984d4911bSMichal Kazior .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 9170d7579d12SMichal Kazior 9171d7579d12SMichal Kazior .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9172d7579d12SMichal Kazior .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 9173d7579d12SMichal Kazior .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9174d7579d12SMichal Kazior .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9175d7579d12SMichal Kazior .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9176d7579d12SMichal Kazior .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9177d7579d12SMichal Kazior .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9178d7579d12SMichal Kazior .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9179d7579d12SMichal Kazior .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9180d7579d12SMichal Kazior .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9181d7579d12SMichal Kazior .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9182d7579d12SMichal Kazior .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 9183d7579d12SMichal Kazior .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 9184d7579d12SMichal Kazior .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 91856d492fe2SMichal Kazior /* .gen_vdev_wmm_conf not implemented */ 9186d7579d12SMichal Kazior .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9187d7579d12SMichal Kazior .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9188d7579d12SMichal Kazior .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 918905e7ba24SChristian Lamparter .gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr, 9190d7579d12SMichal Kazior .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9191d7579d12SMichal Kazior .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9192d7579d12SMichal Kazior .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9193d7579d12SMichal Kazior .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9194d7579d12SMichal Kazior .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9195d7579d12SMichal Kazior .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9196d7579d12SMichal Kazior .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9197d7579d12SMichal Kazior .gen_request_stats = ath10k_wmi_op_gen_request_stats, 9198d7579d12SMichal Kazior .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9199d7579d12SMichal Kazior .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9200d7579d12SMichal Kazior .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 9201d7579d12SMichal Kazior .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9202d7579d12SMichal Kazior .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9203ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9204dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 920565c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 920611597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 920750abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 9208bc6f9ae6SManikanta Pubbisetty .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, 92096e4de1a4SPeter Oh .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype, 921062f77f09SMaharaja /* .gen_pdev_enable_adaptive_cca not implemented */ 9211d7579d12SMichal Kazior }; 9212d7579d12SMichal Kazior 92134a16fbecSRajkumar Manoharan static const struct wmi_ops wmi_10_2_4_ops = { 92144a16fbecSRajkumar Manoharan .rx = ath10k_wmi_10_2_op_rx, 921520de2229SMichal Kazior .pull_fw_stats = ath10k_wmi_10_2_4_op_pull_fw_stats, 92164a16fbecSRajkumar Manoharan .gen_init = ath10k_wmi_10_2_op_gen_init, 92174a16fbecSRajkumar Manoharan .gen_peer_assoc = ath10k_wmi_10_2_op_gen_peer_assoc, 9218a57a6a27SRajkumar Manoharan .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature, 92198a0b459eSRajkumar Manoharan .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, 92204a16fbecSRajkumar Manoharan 92214a16fbecSRajkumar Manoharan /* shared with 10.1 */ 92224a16fbecSRajkumar Manoharan .map_svc = wmi_10x_svc_map, 92234a16fbecSRajkumar Manoharan .pull_svc_rdy = ath10k_wmi_10x_op_pull_svc_rdy_ev, 92244a16fbecSRajkumar Manoharan .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 92254a16fbecSRajkumar Manoharan .gen_start_scan = ath10k_wmi_10x_op_gen_start_scan, 9226e25854f2SMichal Kazior .gen_echo = ath10k_wmi_op_gen_echo, 92274a16fbecSRajkumar Manoharan 92284a16fbecSRajkumar Manoharan .pull_scan = ath10k_wmi_op_pull_scan_ev, 92294a16fbecSRajkumar Manoharan .pull_mgmt_rx = ath10k_wmi_op_pull_mgmt_rx_ev, 92304a16fbecSRajkumar Manoharan .pull_ch_info = ath10k_wmi_op_pull_ch_info_ev, 92314a16fbecSRajkumar Manoharan .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 92324a16fbecSRajkumar Manoharan .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 92338b019fb0SYanbo Li .pull_swba = ath10k_wmi_10_2_4_op_pull_swba_ev, 9234991adf71SRaja Mani .pull_phyerr_hdr = ath10k_wmi_op_pull_phyerr_ev_hdr, 92354a16fbecSRajkumar Manoharan .pull_phyerr = ath10k_wmi_op_pull_phyerr_ev, 92364a16fbecSRajkumar Manoharan .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9237c1a4654aSMichal Kazior .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 923884d4911bSMichal Kazior .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 92394a16fbecSRajkumar Manoharan 92404a16fbecSRajkumar Manoharan .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 92414a16fbecSRajkumar Manoharan .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 92424a16fbecSRajkumar Manoharan .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 92434a16fbecSRajkumar Manoharan .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 92444a16fbecSRajkumar Manoharan .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 92454a16fbecSRajkumar Manoharan .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 92464a16fbecSRajkumar Manoharan .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 92474a16fbecSRajkumar Manoharan .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 92484a16fbecSRajkumar Manoharan .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 92494a16fbecSRajkumar Manoharan .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 92504a16fbecSRajkumar Manoharan .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 92514a16fbecSRajkumar Manoharan .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 92524a16fbecSRajkumar Manoharan .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 92534a16fbecSRajkumar Manoharan .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 92544a16fbecSRajkumar Manoharan .gen_peer_create = ath10k_wmi_op_gen_peer_create, 92554a16fbecSRajkumar Manoharan .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 92564a16fbecSRajkumar Manoharan .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 92574a16fbecSRajkumar Manoharan .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 92584a16fbecSRajkumar Manoharan .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 92594a16fbecSRajkumar Manoharan .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 92604a16fbecSRajkumar Manoharan .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 92614a16fbecSRajkumar Manoharan .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 92624a16fbecSRajkumar Manoharan .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 92634a16fbecSRajkumar Manoharan .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 92644a16fbecSRajkumar Manoharan .gen_request_stats = ath10k_wmi_op_gen_request_stats, 92654a16fbecSRajkumar Manoharan .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 92664a16fbecSRajkumar Manoharan .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 92674a16fbecSRajkumar Manoharan .gen_dbglog_cfg = ath10k_wmi_op_gen_dbglog_cfg, 92684a16fbecSRajkumar Manoharan .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 92694a16fbecSRajkumar Manoharan .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9270ffdd738dSRajkumar Manoharan .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9271dc8ab278SRajkumar Manoharan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 927265c0893dSRajkumar Manoharan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 927311597413SRajkumar Manoharan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 927450abef85SRajkumar Manoharan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 927529542666SMaharaja Kennadyrajan .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, 9276bc6f9ae6SManikanta Pubbisetty .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill, 927762f77f09SMaharaja .gen_pdev_enable_adaptive_cca = 927862f77f09SMaharaja ath10k_wmi_op_gen_pdev_enable_adaptive_cca, 92796e4de1a4SPeter Oh .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype, 928084758d4dSBhagavathi Perumal S .gen_bb_timing = ath10k_wmi_10_2_4_op_gen_bb_timing, 9281be9ce9d8SMichal Kazior /* .gen_bcn_tmpl not implemented */ 92824c4955feSMichal Kazior /* .gen_prb_tmpl not implemented */ 9283369242b4SMichal Kazior /* .gen_p2p_go_bcn_ie not implemented */ 92845b272e30SMichal Kazior /* .gen_adaptive_qcs not implemented */ 92854a16fbecSRajkumar Manoharan }; 92864a16fbecSRajkumar Manoharan 9287840357ccSRaja Mani static const struct wmi_ops wmi_10_4_ops = { 92881c092961SRaja Mani .rx = ath10k_wmi_10_4_op_rx, 9289840357ccSRaja Mani .map_svc = wmi_10_4_svc_map, 9290b2297baaSRaja Mani 929198dd2b92SManikanta Pubbisetty .pull_fw_stats = ath10k_wmi_10_4_op_pull_fw_stats, 9292b2297baaSRaja Mani .pull_scan = ath10k_wmi_op_pull_scan_ev, 92931c092961SRaja Mani .pull_mgmt_rx = ath10k_wmi_10_4_op_pull_mgmt_rx_ev, 9294b2297baaSRaja Mani .pull_ch_info = ath10k_wmi_10_4_op_pull_ch_info_ev, 9295373b48cfSRaja Mani .pull_vdev_start = ath10k_wmi_op_pull_vdev_start_ev, 9296373b48cfSRaja Mani .pull_peer_kick = ath10k_wmi_op_pull_peer_kick_ev, 92973cec3be3SRaja Mani .pull_swba = ath10k_wmi_10_4_op_pull_swba_ev, 92982b0a2e0dSRaja Mani .pull_phyerr_hdr = ath10k_wmi_10_4_op_pull_phyerr_ev_hdr, 92992b0a2e0dSRaja Mani .pull_phyerr = ath10k_wmi_10_4_op_pull_phyerr_ev, 93001c092961SRaja Mani .pull_svc_rdy = ath10k_wmi_main_op_pull_svc_rdy_ev, 9301d02e752fSRaja Mani .pull_rdy = ath10k_wmi_op_pull_rdy_ev, 9302343bf960SMohammed Shafi Shajakhan .pull_roam_ev = ath10k_wmi_op_pull_roam_ev, 93036f6eb1bcSSriram R .pull_dfs_status_ev = ath10k_wmi_10_4_op_pull_dfs_status_ev, 930408e75ea8SVivek Natarajan .get_txbf_conf_scheme = ath10k_wmi_10_4_txbf_conf_scheme, 9305373b48cfSRaja Mani 9306373b48cfSRaja Mani .gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend, 9307373b48cfSRaja Mani .gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume, 930805e7ba24SChristian Lamparter .gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr, 9309373b48cfSRaja Mani .gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd, 9310373b48cfSRaja Mani .gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param, 9311d1e52a8eSRaja Mani .gen_init = ath10k_wmi_10_4_op_gen_init, 9312b2297baaSRaja Mani .gen_start_scan = ath10k_wmi_op_gen_start_scan, 9313b2297baaSRaja Mani .gen_stop_scan = ath10k_wmi_op_gen_stop_scan, 9314373b48cfSRaja Mani .gen_vdev_create = ath10k_wmi_op_gen_vdev_create, 9315373b48cfSRaja Mani .gen_vdev_delete = ath10k_wmi_op_gen_vdev_delete, 9316373b48cfSRaja Mani .gen_vdev_start = ath10k_wmi_op_gen_vdev_start, 9317373b48cfSRaja Mani .gen_vdev_stop = ath10k_wmi_op_gen_vdev_stop, 9318373b48cfSRaja Mani .gen_vdev_up = ath10k_wmi_op_gen_vdev_up, 9319373b48cfSRaja Mani .gen_vdev_down = ath10k_wmi_op_gen_vdev_down, 9320373b48cfSRaja Mani .gen_vdev_set_param = ath10k_wmi_op_gen_vdev_set_param, 9321373b48cfSRaja Mani .gen_vdev_install_key = ath10k_wmi_op_gen_vdev_install_key, 93224535edbdSRaja Mani .gen_vdev_spectral_conf = ath10k_wmi_op_gen_vdev_spectral_conf, 93234535edbdSRaja Mani .gen_vdev_spectral_enable = ath10k_wmi_op_gen_vdev_spectral_enable, 9324373b48cfSRaja Mani .gen_peer_create = ath10k_wmi_op_gen_peer_create, 9325373b48cfSRaja Mani .gen_peer_delete = ath10k_wmi_op_gen_peer_delete, 9326373b48cfSRaja Mani .gen_peer_flush = ath10k_wmi_op_gen_peer_flush, 9327373b48cfSRaja Mani .gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param, 9328b54e16f1SVasanthakumar Thiagarajan .gen_peer_assoc = ath10k_wmi_10_4_op_gen_peer_assoc, 9329373b48cfSRaja Mani .gen_set_psmode = ath10k_wmi_op_gen_set_psmode, 9330373b48cfSRaja Mani .gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps, 9331373b48cfSRaja Mani .gen_set_ap_ps = ath10k_wmi_op_gen_set_ap_ps, 9332373b48cfSRaja Mani .gen_scan_chan_list = ath10k_wmi_op_gen_scan_chan_list, 9333373b48cfSRaja Mani .gen_beacon_dma = ath10k_wmi_op_gen_beacon_dma, 9334373b48cfSRaja Mani .gen_pdev_set_wmm = ath10k_wmi_op_gen_pdev_set_wmm, 9335373b48cfSRaja Mani .gen_force_fw_hang = ath10k_wmi_op_gen_force_fw_hang, 9336373b48cfSRaja Mani .gen_mgmt_tx = ath10k_wmi_op_gen_mgmt_tx, 9337afcbc82cSMaharaja Kennadyrajan .gen_dbglog_cfg = ath10k_wmi_10_4_op_gen_dbglog_cfg, 9338373b48cfSRaja Mani .gen_pktlog_enable = ath10k_wmi_op_gen_pktlog_enable, 9339373b48cfSRaja Mani .gen_pktlog_disable = ath10k_wmi_op_gen_pktlog_disable, 9340373b48cfSRaja Mani .gen_pdev_set_quiet_mode = ath10k_wmi_op_gen_pdev_set_quiet_mode, 9341b2887410SVasanthakumar Thiagarajan .gen_addba_clear_resp = ath10k_wmi_op_gen_addba_clear_resp, 9342b2887410SVasanthakumar Thiagarajan .gen_addba_send = ath10k_wmi_op_gen_addba_send, 9343b2887410SVasanthakumar Thiagarajan .gen_addba_set_resp = ath10k_wmi_op_gen_addba_set_resp, 9344b2887410SVasanthakumar Thiagarajan .gen_delba_send = ath10k_wmi_op_gen_delba_send, 934598dd2b92SManikanta Pubbisetty .fw_stats_fill = ath10k_wmi_10_4_op_fw_stats_fill, 934647771902SRaja Mani .ext_resource_config = ath10k_wmi_10_4_ext_resource_config, 9347add6cd8dSManikanta Pubbisetty .gen_update_fw_tdls_state = ath10k_wmi_10_4_gen_update_fw_tdls_state, 9348add6cd8dSManikanta Pubbisetty .gen_tdls_peer_update = ath10k_wmi_10_4_gen_tdls_peer_update, 9349bc64d052SMaharaja Kennadyrajan .gen_pdev_get_tpc_table_cmdid = 9350bc64d052SMaharaja Kennadyrajan ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid, 93516f6eb1bcSSriram R .gen_radar_found = ath10k_wmi_10_4_gen_radar_found, 9352373b48cfSRaja Mani 9353373b48cfSRaja Mani /* shared with 10.2 */ 935484d4911bSMichal Kazior .pull_echo_ev = ath10k_wmi_op_pull_echo_ev, 935598dd2b92SManikanta Pubbisetty .gen_request_stats = ath10k_wmi_op_gen_request_stats, 93566dd46348STamizh chelvam .gen_pdev_get_temperature = ath10k_wmi_10_2_op_gen_pdev_get_temperature, 93576e4de1a4SPeter Oh .get_vdev_subtype = ath10k_wmi_10_4_op_get_vdev_subtype, 93588a0b459eSRajkumar Manoharan .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info, 9359e25854f2SMichal Kazior .gen_echo = ath10k_wmi_op_gen_echo, 9360ac86aa57SMaharaja Kennadyrajan .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config, 9361840357ccSRaja Mani }; 9362840357ccSRaja Mani 9363b79b9baaSMichal Kazior int ath10k_wmi_attach(struct ath10k *ar) 9364b79b9baaSMichal Kazior { 9365bf3c13abSKalle Valo switch (ar->running_fw->fw_file.wmi_op_version) { 93669bd21322SRaja Mani case ATH10K_FW_WMI_OP_VERSION_10_4: 9367840357ccSRaja Mani ar->wmi.ops = &wmi_10_4_ops; 93682d491e69SRaja Mani ar->wmi.cmd = &wmi_10_4_cmd_map; 936993841a15SRaja Mani ar->wmi.vdev_param = &wmi_10_4_vdev_param_map; 9370d86561ffSRaja Mani ar->wmi.pdev_param = &wmi_10_4_pdev_param_map; 9371c0e33fe6SRakesh Pillai ar->wmi.peer_param = &wmi_peer_param_map; 93723fab30f7STamizh chelvam ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 93737d94f862SAbhishek Ambure ar->wmi_key_cipher = wmi_key_cipher_suites; 93749bd21322SRaja Mani break; 93754a16fbecSRajkumar Manoharan case ATH10K_FW_WMI_OP_VERSION_10_2_4: 93764a16fbecSRajkumar Manoharan ar->wmi.cmd = &wmi_10_2_4_cmd_map; 93774a16fbecSRajkumar Manoharan ar->wmi.ops = &wmi_10_2_4_ops; 93784a16fbecSRajkumar Manoharan ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map; 93794a16fbecSRajkumar Manoharan ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map; 9380c0e33fe6SRakesh Pillai ar->wmi.peer_param = &wmi_peer_param_map; 93813fab30f7STamizh chelvam ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 93827d94f862SAbhishek Ambure ar->wmi_key_cipher = wmi_key_cipher_suites; 93834a16fbecSRajkumar Manoharan break; 9384d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_10_2: 9385b79b9baaSMichal Kazior ar->wmi.cmd = &wmi_10_2_cmd_map; 9386d7579d12SMichal Kazior ar->wmi.ops = &wmi_10_2_ops; 9387b79b9baaSMichal Kazior ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 9388b79b9baaSMichal Kazior ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 9389c0e33fe6SRakesh Pillai ar->wmi.peer_param = &wmi_peer_param_map; 93903fab30f7STamizh chelvam ar->wmi.peer_flags = &wmi_10_2_peer_flags_map; 93917d94f862SAbhishek Ambure ar->wmi_key_cipher = wmi_key_cipher_suites; 9392d7579d12SMichal Kazior break; 9393d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_10_1: 9394d7579d12SMichal Kazior ar->wmi.cmd = &wmi_10x_cmd_map; 9395d7579d12SMichal Kazior ar->wmi.ops = &wmi_10_1_ops; 9396d7579d12SMichal Kazior ar->wmi.vdev_param = &wmi_10x_vdev_param_map; 9397d7579d12SMichal Kazior ar->wmi.pdev_param = &wmi_10x_pdev_param_map; 9398c0e33fe6SRakesh Pillai ar->wmi.peer_param = &wmi_peer_param_map; 93993fab30f7STamizh chelvam ar->wmi.peer_flags = &wmi_10x_peer_flags_map; 94007d94f862SAbhishek Ambure ar->wmi_key_cipher = wmi_key_cipher_suites; 9401d7579d12SMichal Kazior break; 9402d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_MAIN: 9403b79b9baaSMichal Kazior ar->wmi.cmd = &wmi_cmd_map; 9404d7579d12SMichal Kazior ar->wmi.ops = &wmi_ops; 9405b79b9baaSMichal Kazior ar->wmi.vdev_param = &wmi_vdev_param_map; 9406b79b9baaSMichal Kazior ar->wmi.pdev_param = &wmi_pdev_param_map; 9407c0e33fe6SRakesh Pillai ar->wmi.peer_param = &wmi_peer_param_map; 94083fab30f7STamizh chelvam ar->wmi.peer_flags = &wmi_peer_flags_map; 94097d94f862SAbhishek Ambure ar->wmi_key_cipher = wmi_key_cipher_suites; 9410d7579d12SMichal Kazior break; 9411ca996ec5SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_TLV: 9412ca996ec5SMichal Kazior ath10k_wmi_tlv_attach(ar); 94137d94f862SAbhishek Ambure ar->wmi_key_cipher = wmi_tlv_key_cipher_suites; 9414ca996ec5SMichal Kazior break; 9415d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_UNSET: 9416d7579d12SMichal Kazior case ATH10K_FW_WMI_OP_VERSION_MAX: 9417d7579d12SMichal Kazior ath10k_err(ar, "unsupported WMI op version: %d\n", 9418bf3c13abSKalle Valo ar->running_fw->fw_file.wmi_op_version); 9419d7579d12SMichal Kazior return -EINVAL; 9420b79b9baaSMichal Kazior } 9421b79b9baaSMichal Kazior 9422b79b9baaSMichal Kazior init_completion(&ar->wmi.service_ready); 9423b79b9baaSMichal Kazior init_completion(&ar->wmi.unified_ready); 942420ddca21SMichal Kazior init_completion(&ar->wmi.barrier); 94256f6eb1bcSSriram R init_completion(&ar->wmi.radar_confirm); 9426b79b9baaSMichal Kazior 9427c8ecfc1cSRaja Mani INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work); 94286f6eb1bcSSriram R INIT_WORK(&ar->radar_confirmation_work, 94296f6eb1bcSSriram R ath10k_radar_confirmation_work); 9430c8ecfc1cSRaja Mani 9431dc405152SRakesh Pillai if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF, 9432dc405152SRakesh Pillai ar->running_fw->fw_file.fw_features)) { 9433dc405152SRakesh Pillai idr_init(&ar->wmi.mgmt_pending_tx); 9434dc405152SRakesh Pillai } 9435dc405152SRakesh Pillai 9436b79b9baaSMichal Kazior return 0; 9437b79b9baaSMichal Kazior } 9438b79b9baaSMichal Kazior 9439a925a376SVasanthakumar Thiagarajan void ath10k_wmi_free_host_mem(struct ath10k *ar) 9440b79b9baaSMichal Kazior { 9441b79b9baaSMichal Kazior int i; 9442b79b9baaSMichal Kazior 9443b79b9baaSMichal Kazior /* free the host memory chunks requested by firmware */ 9444b79b9baaSMichal Kazior for (i = 0; i < ar->wmi.num_mem_chunks; i++) { 944579e68821SAdrian Chadd dma_free_coherent(ar->dev, 9446b79b9baaSMichal Kazior ar->wmi.mem_chunks[i].len, 944779e68821SAdrian Chadd ar->wmi.mem_chunks[i].vaddr, 944879e68821SAdrian Chadd ar->wmi.mem_chunks[i].paddr); 9449b79b9baaSMichal Kazior } 9450b79b9baaSMichal Kazior 9451b79b9baaSMichal Kazior ar->wmi.num_mem_chunks = 0; 9452b79b9baaSMichal Kazior } 9453a925a376SVasanthakumar Thiagarajan 9454dc405152SRakesh Pillai static int ath10k_wmi_mgmt_tx_clean_up_pending(int msdu_id, void *ptr, 9455dc405152SRakesh Pillai void *ctx) 9456dc405152SRakesh Pillai { 9457dc405152SRakesh Pillai struct ath10k_mgmt_tx_pkt_addr *pkt_addr = ptr; 9458dc405152SRakesh Pillai struct ath10k *ar = ctx; 9459dc405152SRakesh Pillai struct sk_buff *msdu; 9460dc405152SRakesh Pillai 9461dc405152SRakesh Pillai ath10k_dbg(ar, ATH10K_DBG_WMI, 9462dc405152SRakesh Pillai "force cleanup mgmt msdu_id %hu\n", msdu_id); 9463dc405152SRakesh Pillai 9464dc405152SRakesh Pillai msdu = pkt_addr->vaddr; 9465dc405152SRakesh Pillai dma_unmap_single(ar->dev, pkt_addr->paddr, 9466dc405152SRakesh Pillai msdu->len, DMA_FROM_DEVICE); 9467dc405152SRakesh Pillai ieee80211_free_txskb(ar->hw, msdu); 9468dc405152SRakesh Pillai 9469dc405152SRakesh Pillai return 0; 9470dc405152SRakesh Pillai } 9471dc405152SRakesh Pillai 9472a925a376SVasanthakumar Thiagarajan void ath10k_wmi_detach(struct ath10k *ar) 9473a925a376SVasanthakumar Thiagarajan { 9474dc405152SRakesh Pillai if (test_bit(ATH10K_FW_FEATURE_MGMT_TX_BY_REF, 9475dc405152SRakesh Pillai ar->running_fw->fw_file.fw_features)) { 9476dc405152SRakesh Pillai spin_lock_bh(&ar->data_lock); 9477dc405152SRakesh Pillai idr_for_each(&ar->wmi.mgmt_pending_tx, 9478dc405152SRakesh Pillai ath10k_wmi_mgmt_tx_clean_up_pending, ar); 9479dc405152SRakesh Pillai idr_destroy(&ar->wmi.mgmt_pending_tx); 9480dc405152SRakesh Pillai spin_unlock_bh(&ar->data_lock); 9481dc405152SRakesh Pillai } 9482dc405152SRakesh Pillai 9483a925a376SVasanthakumar Thiagarajan cancel_work_sync(&ar->svc_rdy_work); 9484a925a376SVasanthakumar Thiagarajan 9485a925a376SVasanthakumar Thiagarajan if (ar->svc_rdy_skb) 9486a925a376SVasanthakumar Thiagarajan dev_kfree_skb(ar->svc_rdy_skb); 9487a925a376SVasanthakumar Thiagarajan } 9488