| /* |
| * Copyright (c) 2005-2011 Atheros Communications Inc. |
| * Copyright (c) 2011-2014 Qualcomm Atheros, Inc. |
| * |
| * Permission to use, copy, modify, and/or distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| */ |
| |
| #ifndef GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_WMI_OPS_H_ |
| #define GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_WMI_OPS_H_ |
| |
| struct ath10k; |
| |
| struct wmi_ops { |
| void (*rx)(struct ath10k* ar, struct ath10k_msg_buf* buf); |
| void (*map_svc)(const uint32_t* in, BITARR_TYPE* out, size_t len); |
| |
| int (*pull_scan)(struct ath10k* ar, struct ath10k_msg_buf* buf, struct wmi_scan_ev_arg* arg); |
| int (*pull_mgmt_rx)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_mgmt_rx_ev_arg* arg); |
| int (*pull_ch_info)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_ch_info_ev_arg* arg); |
| int (*pull_vdev_start)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_vdev_start_ev_arg* arg); |
| int (*pull_peer_kick)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_peer_kick_ev_arg* arg); |
| int (*pull_swba)(struct ath10k* ar, struct ath10k_msg_buf* buf, struct wmi_swba_ev_arg* arg); |
| int (*pull_phyerr_hdr)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_phyerr_hdr_arg* arg); |
| int (*pull_phyerr)(struct ath10k* ar, const void* phyerr_buf, int left_len, |
| struct wmi_phyerr_ev_arg* arg); |
| zx_status_t (*pull_svc_rdy)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_svc_rdy_ev_arg* arg); |
| zx_status_t (*pull_rdy)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_rdy_ev_arg* arg); |
| int (*pull_fw_stats)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct ath10k_fw_stats* stats); |
| int (*pull_roam_ev)(struct ath10k* ar, struct ath10k_msg_buf* buf, struct wmi_roam_ev_arg* arg); |
| int (*pull_wow_event)(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_wow_ev_arg* arg); |
| zx_status_t (*pull_echo_ev)(struct ath10k* ar, struct ath10k_msg_buf* msg_buf, |
| struct wmi_echo_ev_arg* arg); |
| enum wmi_txbf_conf (*get_txbf_conf_scheme)(struct ath10k* ar); |
| |
| zx_status_t (*gen_pdev_suspend)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t suspend_opt); |
| zx_status_t (*gen_pdev_resume)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr); |
| zx_status_t (*gen_pdev_set_rd)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint16_t rd, uint16_t rd2g, uint16_t rd5g, uint16_t ctl2g, |
| uint16_t ctl5g, enum wmi_dfs_region dfs_reg); |
| zx_status_t (*gen_pdev_set_param)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t id, uint32_t value); |
| zx_status_t (*gen_init)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr); |
| zx_status_t (*gen_start_scan)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_start_scan_arg* arg); |
| zx_status_t (*gen_stop_scan)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_stop_scan_arg* arg); |
| zx_status_t (*gen_vdev_create)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, enum wmi_vdev_type type, |
| enum wmi_vdev_subtype subtype, const uint8_t macaddr[ETH_ALEN]); |
| zx_status_t (*gen_vdev_delete)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id); |
| zx_status_t (*gen_vdev_start)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_vdev_start_request_arg* arg, bool restart); |
| zx_status_t (*gen_vdev_stop)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id); |
| zx_status_t (*gen_vdev_up)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, uint32_t aid, const uint8_t* bssid); |
| zx_status_t (*gen_vdev_down)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id); |
| zx_status_t (*gen_vdev_set_param)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, uint32_t param_id, uint32_t param_value); |
| zx_status_t (*gen_vdev_install_key)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_vdev_install_key_arg* arg); |
| zx_status_t (*gen_vdev_spectral_conf)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_vdev_spectral_conf_arg* arg); |
| zx_status_t (*gen_vdev_spectral_enable)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, uint32_t trigger, uint32_t enable); |
| zx_status_t (*gen_vdev_wmm_conf)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const struct wmi_wmm_params_all_arg* arg); |
| zx_status_t (*gen_peer_create)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t peer_addr[ETH_ALEN], |
| enum wmi_peer_type peer_type); |
| zx_status_t (*gen_peer_delete)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t peer_addr[ETH_ALEN]); |
| zx_status_t (*gen_peer_flush)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t peer_addr[ETH_ALEN], |
| uint32_t tid_bitmap); |
| zx_status_t (*gen_peer_set_param)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t* peer_addr, |
| enum wmi_peer_param param_id, uint32_t param_value); |
| zx_status_t (*gen_peer_assoc)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_peer_assoc_complete_arg* arg); |
| zx_status_t (*gen_set_psmode)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, enum wmi_sta_ps_mode psmode); |
| zx_status_t (*gen_set_sta_ps)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, enum wmi_sta_powersave_param param_id, |
| uint32_t value); |
| zx_status_t (*gen_set_ap_ps)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t* mac, |
| enum wmi_ap_ps_peer_param param_id, uint32_t value); |
| zx_status_t (*gen_scan_chan_list)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_scan_chan_list_arg* arg); |
| zx_status_t (*gen_beacon_dma)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const void* bcn, size_t bcn_len, |
| uint32_t bcn_paddr, bool dtim_zero, bool deliver_cab); |
| zx_status_t (*gen_pdev_set_wmm)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_wmm_params_all_arg* arg); |
| zx_status_t (*gen_request_stats)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t stats_mask); |
| zx_status_t (*gen_force_fw_hang)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| enum wmi_force_fw_hang_type type, uint32_t delay_ms); |
| zx_status_t (*gen_mgmt_tx)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| struct ath10k_msg_buf* msdu); |
| zx_status_t (*gen_dbglog_cfg)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint64_t module_enable, uint32_t log_level); |
| zx_status_t (*gen_pktlog_enable)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t filter); |
| zx_status_t (*gen_pktlog_disable)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr); |
| zx_status_t (*gen_pdev_set_quiet_mode)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t period, uint32_t duration, uint32_t next_offset, |
| uint32_t enabled); |
| zx_status_t (*gen_pdev_get_temperature)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr); |
| zx_status_t (*gen_addba_clear_resp)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t* mac); |
| zx_status_t (*gen_addba_send)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t* mac, uint32_t tid, |
| uint32_t buf_size); |
| zx_status_t (*gen_addba_set_resp)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t* mac, uint32_t tid, |
| uint32_t status); |
| zx_status_t (*gen_delba_send)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t* mac, uint32_t tid, |
| uint32_t initiator, uint32_t reason); |
| zx_status_t (*gen_bcn_tmpl)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, uint32_t tim_ie_offset, |
| struct ath10k_msg_buf* bcn, uint32_t prb_caps, uint32_t prb_erp, |
| void* prb_ies, size_t prb_ies_len); |
| zx_status_t (*gen_prb_tmpl)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, struct ath10k_msg_buf* prb); |
| zx_status_t (*gen_p2p_go_bcn_ie)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t* p2p_ie); |
| zx_status_t (*gen_vdev_sta_uapsd)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, const uint8_t peer_addr[ETH_ALEN], |
| const struct wmi_sta_uapsd_auto_trig_arg* args, |
| uint32_t num_ac); |
| zx_status_t (*gen_sta_keepalive)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_sta_keepalive_arg* arg); |
| zx_status_t (*gen_wow_enable)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr); |
| zx_status_t (*gen_wow_add_wakeup_event)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, enum wmi_wow_wakeup_event event, |
| uint32_t enable); |
| zx_status_t (*gen_wow_host_wakeup_ind)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr); |
| zx_status_t (*gen_wow_add_pattern)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, uint32_t pattern_id, |
| const uint8_t* pattern, const uint8_t* mask, int pattern_len, |
| int pattern_offset); |
| zx_status_t (*gen_wow_del_pattern)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, uint32_t pattern_id); |
| zx_status_t (*gen_update_fw_tdls_state)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t vdev_id, enum wmi_tdls_state state); |
| zx_status_t (*gen_tdls_peer_update)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| const struct wmi_tdls_peer_update_cmd_arg* arg, |
| const struct wmi_tdls_peer_capab_arg* cap, |
| const struct wmi_channel_arg* chan); |
| zx_status_t (*gen_adaptive_qcs)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| bool enable); |
| zx_status_t (*gen_pdev_get_tpc_config)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| uint32_t param); |
| void (*fw_stats_fill)(struct ath10k* ar, struct ath10k_fw_stats* fw_stats, char* buf); |
| zx_status_t (*gen_pdev_enable_adaptive_cca)(struct ath10k* ar, |
| struct ath10k_msg_buf** msg_buf_ptr, uint8_t enable, |
| uint32_t detect_level, uint32_t detect_margin); |
| zx_status_t (*ext_resource_config)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, |
| enum wmi_host_platform_type type, |
| uint32_t fw_feature_bitmap); |
| zx_status_t (*get_vdev_subtype)(struct ath10k* ar, enum wmi_vdev_subtype subtype, int* result); |
| zx_status_t (*gen_pdev_bss_chan_info_req)(struct ath10k* ar, |
| struct ath10k_msg_buf** msg_buf_ptr, |
| enum wmi_bss_survey_req_type type); |
| zx_status_t (*gen_echo)(struct ath10k* ar, struct ath10k_msg_buf** msg_buf_ptr, uint32_t value); |
| }; |
| |
| zx_status_t ath10k_wmi_cmd_send(struct ath10k* ar, struct ath10k_msg_buf* buf, uint32_t cmd_id); |
| |
| static inline zx_status_t ath10k_wmi_rx(struct ath10k* ar, struct ath10k_msg_buf* buf) { |
| if (COND_WARN_ONCE(!ar->wmi.ops->rx)) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| ar->wmi.ops->rx(ar, buf); |
| return ZX_OK; |
| } |
| |
| static inline zx_status_t ath10k_wmi_map_svc(struct ath10k* ar, const uint32_t* in, |
| BITARR_TYPE* out, size_t len) { |
| if (!ar->wmi.ops->map_svc) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| ar->wmi.ops->map_svc(in, out, len); |
| return ZX_OK; |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_scan(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_scan_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_scan) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_scan(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_mgmt_rx(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_mgmt_rx_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_mgmt_rx) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_mgmt_rx(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_ch_info(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_ch_info_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_ch_info) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_ch_info(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_vdev_start(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_vdev_start_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_vdev_start) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_vdev_start(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_peer_kick(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_peer_kick_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_peer_kick) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_peer_kick(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_swba(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_swba_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_swba) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_swba(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_phyerr_hdr(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_phyerr_hdr_arg* arg) { |
| if (!ar->wmi.ops->pull_phyerr_hdr) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_phyerr_hdr(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_phyerr(struct ath10k* ar, const void* phyerr_buf, |
| int left_len, struct wmi_phyerr_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_phyerr) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_phyerr(ar, phyerr_buf, left_len, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_svc_rdy(struct ath10k* ar, struct ath10k_msg_buf* msg_buf, |
| struct wmi_svc_rdy_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_svc_rdy) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_svc_rdy(ar, msg_buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_rdy(struct ath10k* ar, struct ath10k_msg_buf* msg_buf, |
| struct wmi_rdy_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_rdy) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_rdy(ar, msg_buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_fw_stats(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct ath10k_fw_stats* stats) { |
| if (!ar->wmi.ops->pull_fw_stats) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_fw_stats(ar, buf, stats); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_roam_ev(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_roam_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_roam_ev) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_roam_ev(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_wow_event(struct ath10k* ar, struct ath10k_msg_buf* buf, |
| struct wmi_wow_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_wow_event) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_wow_event(ar, buf, arg); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pull_echo_ev(struct ath10k* ar, struct ath10k_msg_buf* msg_buf, |
| struct wmi_echo_ev_arg* arg) { |
| if (!ar->wmi.ops->pull_echo_ev) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->pull_echo_ev(ar, msg_buf, arg); |
| } |
| |
| static inline enum wmi_txbf_conf ath10k_wmi_get_txbf_conf_scheme(struct ath10k* ar) { |
| if (!ar->wmi.ops->get_txbf_conf_scheme) { return WMI_TXBF_CONF_UNSUPPORTED; } |
| |
| return ar->wmi.ops->get_txbf_conf_scheme(ar); |
| } |
| |
| static inline zx_status_t ath10k_wmi_mgmt_tx(struct ath10k* ar, struct ath10k_msg_buf* msdu) { |
| struct ath10k_msg_buf* buf; |
| zx_status_t ret; |
| |
| if (!ar->wmi.ops->gen_mgmt_tx) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| ret = ar->wmi.ops->gen_mgmt_tx(ar, &buf, msdu); |
| if (ret != ZX_OK) { return ret; } |
| |
| ret = ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->mgmt_tx_cmdid); |
| if (ret != ZX_OK) { return ret; } |
| |
| return ZX_OK; |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_set_regdomain(struct ath10k* ar, uint16_t rd, |
| uint16_t rd2g, uint16_t rd5g, |
| uint16_t ctl2g, uint16_t ctl5g, |
| enum wmi_dfs_region dfs_reg) { |
| zx_status_t status; |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pdev_set_rd) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| status = ar->wmi.ops->gen_pdev_set_rd(ar, &buf, rd, rd2g, rd5g, ctl2g, ctl5g, dfs_reg); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_set_regdomain_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_suspend_target(struct ath10k* ar, uint32_t suspend_opt) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pdev_suspend) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_pdev_suspend(ar, &buf, suspend_opt); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_suspend_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_resume_target(struct ath10k* ar) { |
| struct ath10k_msg_buf* buf; |
| zx_status_t status; |
| |
| if (!ar->wmi.ops->gen_pdev_resume) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| status = ar->wmi.ops->gen_pdev_resume(ar, &buf); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_resume_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_set_param(struct ath10k* ar, uint32_t id, |
| uint32_t value) { |
| struct ath10k_msg_buf* buf; |
| zx_status_t status; |
| |
| if (!ar->wmi.ops->gen_pdev_set_param) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| status = ar->wmi.ops->gen_pdev_set_param(ar, &buf, id, value); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_set_param_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_cmd_init(struct ath10k* ar) { |
| struct ath10k_msg_buf* buf; |
| zx_status_t status; |
| |
| if (!ar->wmi.ops->gen_init) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| status = ar->wmi.ops->gen_init(ar, &buf); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->init_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_start_scan(struct ath10k* ar, |
| const struct wmi_start_scan_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_start_scan) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_start_scan(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->start_scan_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_stop_scan(struct ath10k* ar, |
| const struct wmi_stop_scan_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_stop_scan) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_stop_scan(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->stop_scan_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_create(struct ath10k* ar, uint32_t vdev_id, |
| enum wmi_vdev_type type, |
| enum wmi_vdev_subtype subtype, |
| const uint8_t macaddr[ETH_ALEN]) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_create) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_create(ar, &buf, vdev_id, type, subtype, macaddr); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_create_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_delete(struct ath10k* ar, uint32_t vdev_id) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_delete) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_delete(ar, &buf, vdev_id); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_delete_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_start(struct ath10k* ar, |
| const struct wmi_vdev_start_request_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_start) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_start(ar, &buf, arg, false); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_start_request_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_restart(struct ath10k* ar, |
| const struct wmi_vdev_start_request_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_start) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_start(ar, &buf, arg, true); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_restart_request_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_stop(struct ath10k* ar, uint32_t vdev_id) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_stop) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_stop(ar, &buf, vdev_id); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_stop_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_up(struct ath10k* ar, uint32_t vdev_id, uint32_t aid, |
| const uint8_t* bssid) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_up) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_up(ar, &buf, vdev_id, aid, bssid); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_up_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_down(struct ath10k* ar, uint32_t vdev_id) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_down) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_down(ar, &buf, vdev_id); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_down_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_set_param(struct ath10k* ar, uint32_t vdev_id, |
| uint32_t param_id, uint32_t param_value) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_set_param) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_set_param(ar, &buf, vdev_id, param_id, param_value); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_set_param_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_install_key(struct ath10k* ar, |
| const struct wmi_vdev_install_key_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_vdev_install_key) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_install_key(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->vdev_install_key_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_spectral_conf( |
| struct ath10k* ar, const struct wmi_vdev_spectral_conf_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_vdev_spectral_conf) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_spectral_conf(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_spectral_enable(struct ath10k* ar, uint32_t vdev_id, |
| uint32_t trigger, uint32_t enable) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_vdev_spectral_enable) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_spectral_enable(ar, &buf, vdev_id, trigger, enable); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_sta_uapsd(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t peer_addr[ETH_ALEN], |
| const struct wmi_sta_uapsd_auto_trig_arg* args, |
| uint32_t num_ac) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_vdev_sta_uapsd) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = |
| ar->wmi.ops->gen_vdev_sta_uapsd(ar, &buf, vdev_id, peer_addr, args, num_ac); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_vdev_wmm_conf(struct ath10k* ar, uint32_t vdev_id, |
| const struct wmi_wmm_params_all_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| zx_status_t status = ar->wmi.ops->gen_vdev_wmm_conf(ar, &buf, vdev_id, arg); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_peer_create(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t peer_addr[ETH_ALEN], |
| enum wmi_peer_type peer_type) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_peer_create) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_peer_create(ar, &buf, vdev_id, peer_addr, peer_type); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->peer_create_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_peer_delete(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t peer_addr[ETH_ALEN]) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_peer_delete) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_peer_delete(ar, &buf, vdev_id, peer_addr); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->peer_delete_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_peer_flush(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t peer_addr[ETH_ALEN], |
| uint32_t tid_bitmap) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_peer_flush) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_peer_flush(ar, &buf, vdev_id, peer_addr, tid_bitmap); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->peer_flush_tids_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_peer_set_param(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t* peer_addr, |
| enum wmi_peer_param param_id, |
| uint32_t param_value) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_peer_set_param) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = |
| ar->wmi.ops->gen_peer_set_param(ar, &buf, vdev_id, peer_addr, param_id, param_value); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->peer_set_param_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_set_psmode(struct ath10k* ar, uint32_t vdev_id, |
| enum wmi_sta_ps_mode psmode) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_set_psmode) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_set_psmode(ar, &buf, vdev_id, psmode); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->sta_powersave_mode_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_set_sta_ps_param(struct ath10k* ar, uint32_t vdev_id, |
| enum wmi_sta_powersave_param param_id, |
| uint32_t value) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_set_sta_ps) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_set_sta_ps(ar, &buf, vdev_id, param_id, value); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->sta_powersave_param_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_set_ap_ps_param(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t* mac, |
| enum wmi_ap_ps_peer_param param_id, |
| uint32_t value) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_set_ap_ps) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_set_ap_ps(ar, &buf, vdev_id, mac, param_id, value); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->ap_ps_peer_param_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_scan_chan_list(struct ath10k* ar, |
| const struct wmi_scan_chan_list_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_scan_chan_list) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_scan_chan_list(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->scan_chan_list_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_peer_assoc(struct ath10k* ar, |
| const struct wmi_peer_assoc_complete_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_peer_assoc) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_peer_assoc(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->peer_assoc_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_beacon_send_ref_nowait(struct ath10k* ar, uint32_t vdev_id, |
| const void* bcn, size_t bcn_len, |
| uint32_t bcn_paddr, bool dtim_zero, |
| bool deliver_cab) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_beacon_dma) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_beacon_dma(ar, &buf, vdev_id, bcn, bcn_len, bcn_paddr, |
| dtim_zero, deliver_cab); |
| if (status != ZX_OK) { return status; } |
| |
| status = ath10k_wmi_cmd_send_nowait(ar, buf, ar->wmi.cmd->pdev_send_bcn_cmdid); |
| if (status != ZX_OK) { |
| ath10k_msg_buf_free(buf); |
| return status; |
| } |
| |
| return ZX_OK; |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_set_wmm_params(struct ath10k* ar, |
| const struct wmi_wmm_params_all_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pdev_set_wmm) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_pdev_set_wmm(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_set_wmm_params_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_request_stats(struct ath10k* ar, uint32_t stats_mask) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_request_stats) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_request_stats(ar, &buf, stats_mask); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->request_stats_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_force_fw_hang(struct ath10k* ar, |
| enum wmi_force_fw_hang_type type, |
| uint32_t delay_ms) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_force_fw_hang) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_force_fw_hang(ar, &buf, type, delay_ms); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->force_fw_hang_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_dbglog_cfg(struct ath10k* ar, uint64_t module_enable, |
| uint32_t log_level) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_dbglog_cfg) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_dbglog_cfg(ar, &buf, module_enable, log_level); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->dbglog_cfg_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_pktlog_enable(struct ath10k* ar, uint32_t filter) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pktlog_enable) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_pktlog_enable(ar, &buf, filter); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_pktlog_enable_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_pktlog_disable(struct ath10k* ar) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pktlog_disable) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_pktlog_disable(ar, &buf); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_pktlog_disable_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_set_quiet_mode(struct ath10k* ar, uint32_t period, |
| uint32_t duration, uint32_t next_offset, |
| uint32_t enabled) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pdev_set_quiet_mode) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = |
| ar->wmi.ops->gen_pdev_set_quiet_mode(ar, &buf, period, duration, next_offset, enabled); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_set_quiet_mode_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_get_temperature(struct ath10k* ar) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pdev_get_temperature) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_pdev_get_temperature(ar, &buf); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_get_temperature_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_addba_clear_resp(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t* mac) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_addba_clear_resp) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_addba_clear_resp(ar, &buf, vdev_id, mac); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->addba_clear_resp_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_addba_send(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t* mac, uint32_t tid, |
| uint32_t buf_size) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_addba_send) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_addba_send(ar, &buf, vdev_id, mac, tid, buf_size); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->addba_send_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_addba_set_resp(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t* mac, uint32_t tid, |
| uint32_t status) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_addba_set_resp) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t result = ar->wmi.ops->gen_addba_set_resp(ar, &buf, vdev_id, mac, tid, status); |
| if (result != ZX_OK) { return result; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->addba_set_resp_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_delba_send(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t* mac, uint32_t tid, |
| uint32_t initiator, uint32_t reason) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_delba_send) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = |
| ar->wmi.ops->gen_delba_send(ar, &buf, vdev_id, mac, tid, initiator, reason); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->delba_send_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_bcn_tmpl(struct ath10k* ar, uint32_t vdev_id, |
| uint32_t tim_ie_offset, struct ath10k_msg_buf* bcn, |
| uint32_t prb_caps, uint32_t prb_erp, void* prb_ies, |
| size_t prb_ies_len) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_bcn_tmpl) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_bcn_tmpl(ar, &buf, vdev_id, tim_ie_offset, bcn, prb_caps, |
| prb_erp, prb_ies, prb_ies_len); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->bcn_tmpl_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_prb_tmpl(struct ath10k* ar, uint32_t vdev_id, |
| struct ath10k_msg_buf* prb) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_prb_tmpl) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_prb_tmpl(ar, &buf, vdev_id, prb); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->prb_tmpl_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_p2p_go_bcn_ie(struct ath10k* ar, uint32_t vdev_id, |
| const uint8_t* p2p_ie) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_p2p_go_bcn_ie) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, &buf, vdev_id, p2p_ie); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->p2p_go_set_beacon_ie); |
| } |
| |
| static inline zx_status_t ath10k_wmi_sta_keepalive(struct ath10k* ar, |
| const struct wmi_sta_keepalive_arg* arg) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_sta_keepalive) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_sta_keepalive(ar, &buf, arg); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->sta_keepalive_cmd; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_wow_enable(struct ath10k* ar) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_wow_enable) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_wow_enable(ar, &buf); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->wow_enable_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_wow_add_wakeup_event(struct ath10k* ar, uint32_t vdev_id, |
| enum wmi_wow_wakeup_event event, |
| uint32_t enable) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_wow_add_wakeup_event) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_wow_add_wakeup_event(ar, &buf, vdev_id, event, enable); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->wow_enable_disable_wake_event_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_wow_host_wakeup_ind(struct ath10k* ar) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_wow_host_wakeup_ind) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_wow_host_wakeup_ind(ar, &buf); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->wow_hostwakeup_from_sleep_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_wow_add_pattern(struct ath10k* ar, uint32_t vdev_id, |
| uint32_t pattern_id, const uint8_t* pattern, |
| const uint8_t* mask, int pattern_len, |
| int pattern_offset) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_wow_add_pattern) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_wow_add_pattern(ar, &buf, vdev_id, pattern_id, pattern, |
| mask, pattern_len, pattern_offset); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->wow_add_wake_pattern_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_wow_del_pattern(struct ath10k* ar, uint32_t vdev_id, |
| uint32_t pattern_id) { |
| struct ath10k_msg_buf* buf; |
| uint32_t cmd_id; |
| |
| if (!ar->wmi.ops->gen_wow_del_pattern) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_wow_del_pattern(ar, &buf, vdev_id, pattern_id); |
| if (status != ZX_OK) { return status; } |
| |
| cmd_id = ar->wmi.cmd->wow_del_wake_pattern_cmdid; |
| return ath10k_wmi_cmd_send(ar, buf, cmd_id); |
| } |
| |
| static inline zx_status_t ath10k_wmi_update_fw_tdls_state(struct ath10k* ar, uint32_t vdev_id, |
| enum wmi_tdls_state state) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_update_fw_tdls_state) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_update_fw_tdls_state(ar, &buf, vdev_id, state); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->tdls_set_state_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_tdls_peer_update( |
| struct ath10k* ar, const struct wmi_tdls_peer_update_cmd_arg* arg, |
| const struct wmi_tdls_peer_capab_arg* cap, const struct wmi_channel_arg* chan) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_tdls_peer_update) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_tdls_peer_update(ar, &buf, arg, cap, chan); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->tdls_peer_update_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_adaptive_qcs(struct ath10k* ar, bool enable) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_adaptive_qcs) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_adaptive_qcs(ar, &buf, enable); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->adaptive_qcs_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_get_tpc_config(struct ath10k* ar, uint32_t param) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pdev_get_tpc_config) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->gen_pdev_get_tpc_config(ar, &buf, param); |
| |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_get_tpc_config_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_fw_stats_fill(struct ath10k* ar, |
| struct ath10k_fw_stats* fw_stats, char* buf) { |
| if (!ar->wmi.ops->fw_stats_fill) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| ar->wmi.ops->fw_stats_fill(ar, fw_stats, buf); |
| return ZX_OK; |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_enable_adaptive_cca(struct ath10k* ar, uint8_t enable, |
| uint32_t detect_level, |
| uint32_t detect_margin) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->gen_pdev_enable_adaptive_cca) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = |
| ar->wmi.ops->gen_pdev_enable_adaptive_cca(ar, &buf, enable, detect_level, detect_margin); |
| |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->pdev_enable_adaptive_cca_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_ext_resource_config(struct ath10k* ar, |
| enum wmi_host_platform_type type, |
| uint32_t fw_feature_bitmap) { |
| struct ath10k_msg_buf* buf; |
| |
| if (!ar->wmi.ops->ext_resource_config) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = ar->wmi.ops->ext_resource_config(ar, &buf, type, fw_feature_bitmap); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->ext_resource_cfg_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_get_vdev_subtype(struct ath10k* ar, |
| enum wmi_vdev_subtype subtype, |
| int* result) { |
| if (!ar->wmi.ops->get_vdev_subtype) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| return ar->wmi.ops->get_vdev_subtype(ar, subtype, result); |
| } |
| |
| static inline zx_status_t ath10k_wmi_pdev_bss_chan_info_request(struct ath10k* ar, |
| enum wmi_bss_survey_req_type type) { |
| struct ath10k_wmi* wmi = &ar->wmi; |
| struct ath10k_msg_buf* buf; |
| |
| if (!wmi->ops->gen_pdev_bss_chan_info_req) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| zx_status_t status = wmi->ops->gen_pdev_bss_chan_info_req(ar, &buf, type); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, wmi->cmd->pdev_bss_chan_info_request_cmdid); |
| } |
| |
| static inline zx_status_t ath10k_wmi_echo(struct ath10k* ar, uint32_t value) { |
| struct ath10k_wmi* wmi = &ar->wmi; |
| struct ath10k_msg_buf* buf; |
| zx_status_t status; |
| |
| if (!wmi->ops->gen_echo) { return ZX_ERR_NOT_SUPPORTED; } |
| |
| status = wmi->ops->gen_echo(ar, &buf, value); |
| if (status != ZX_OK) { return status; } |
| |
| return ath10k_wmi_cmd_send(ar, buf, wmi->cmd->echo_cmdid); |
| } |
| |
| #endif // GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_WMI_OPS_H_ |