1d7579d12SMichal Kazior /* 2d7579d12SMichal Kazior * Copyright (c) 2005-2011 Atheros Communications Inc. 3d7579d12SMichal Kazior * Copyright (c) 2011-2014 Qualcomm Atheros, Inc. 4d7579d12SMichal Kazior * 5d7579d12SMichal Kazior * Permission to use, copy, modify, and/or distribute this software for any 6d7579d12SMichal Kazior * purpose with or without fee is hereby granted, provided that the above 7d7579d12SMichal Kazior * copyright notice and this permission notice appear in all copies. 8d7579d12SMichal Kazior * 9d7579d12SMichal Kazior * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10d7579d12SMichal Kazior * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11d7579d12SMichal Kazior * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12d7579d12SMichal Kazior * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13d7579d12SMichal Kazior * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14d7579d12SMichal Kazior * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15d7579d12SMichal Kazior * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16d7579d12SMichal Kazior */ 17d7579d12SMichal Kazior 18d7579d12SMichal Kazior #ifndef _WMI_OPS_H_ 19d7579d12SMichal Kazior #define _WMI_OPS_H_ 20d7579d12SMichal Kazior 21d7579d12SMichal Kazior struct ath10k; 22d7579d12SMichal Kazior struct sk_buff; 23d7579d12SMichal Kazior 24d7579d12SMichal Kazior struct wmi_ops { 25d7579d12SMichal Kazior void (*rx)(struct ath10k *ar, struct sk_buff *skb); 26d7579d12SMichal Kazior void (*map_svc)(const __le32 *in, unsigned long *out, size_t len); 27d7579d12SMichal Kazior 28d7579d12SMichal Kazior int (*pull_scan)(struct ath10k *ar, struct sk_buff *skb, 29d7579d12SMichal Kazior struct wmi_scan_ev_arg *arg); 30d7579d12SMichal Kazior int (*pull_mgmt_rx)(struct ath10k *ar, struct sk_buff *skb, 31d7579d12SMichal Kazior struct wmi_mgmt_rx_ev_arg *arg); 32d7579d12SMichal Kazior int (*pull_ch_info)(struct ath10k *ar, struct sk_buff *skb, 33d7579d12SMichal Kazior struct wmi_ch_info_ev_arg *arg); 34d7579d12SMichal Kazior int (*pull_vdev_start)(struct ath10k *ar, struct sk_buff *skb, 35d7579d12SMichal Kazior struct wmi_vdev_start_ev_arg *arg); 36d7579d12SMichal Kazior int (*pull_peer_kick)(struct ath10k *ar, struct sk_buff *skb, 37d7579d12SMichal Kazior struct wmi_peer_kick_ev_arg *arg); 38d7579d12SMichal Kazior int (*pull_swba)(struct ath10k *ar, struct sk_buff *skb, 39d7579d12SMichal Kazior struct wmi_swba_ev_arg *arg); 40d7579d12SMichal Kazior int (*pull_phyerr)(struct ath10k *ar, struct sk_buff *skb, 41d7579d12SMichal Kazior struct wmi_phyerr_ev_arg *arg); 42d7579d12SMichal Kazior int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb, 43d7579d12SMichal Kazior struct wmi_svc_rdy_ev_arg *arg); 44d7579d12SMichal Kazior int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb, 45d7579d12SMichal Kazior struct wmi_rdy_ev_arg *arg); 46d7579d12SMichal Kazior int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb, 47d7579d12SMichal Kazior struct ath10k_fw_stats *stats); 48d7579d12SMichal Kazior 49d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt); 50d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar); 51d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g, 52d7579d12SMichal Kazior u16 rd5g, u16 ctl2g, u16 ctl5g, 53d7579d12SMichal Kazior enum wmi_dfs_region dfs_reg); 54d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id, 55d7579d12SMichal Kazior u32 value); 56d7579d12SMichal Kazior struct sk_buff *(*gen_init)(struct ath10k *ar); 57d7579d12SMichal Kazior struct sk_buff *(*gen_start_scan)(struct ath10k *ar, 58d7579d12SMichal Kazior const struct wmi_start_scan_arg *arg); 59d7579d12SMichal Kazior struct sk_buff *(*gen_stop_scan)(struct ath10k *ar, 60d7579d12SMichal Kazior const struct wmi_stop_scan_arg *arg); 61d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id, 62d7579d12SMichal Kazior enum wmi_vdev_type type, 63d7579d12SMichal Kazior enum wmi_vdev_subtype subtype, 64d7579d12SMichal Kazior const u8 macaddr[ETH_ALEN]); 65d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id); 66d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_start)(struct ath10k *ar, 67d7579d12SMichal Kazior const struct wmi_vdev_start_request_arg *arg, 68d7579d12SMichal Kazior bool restart); 69d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id); 70d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid, 71d7579d12SMichal Kazior const u8 *bssid); 72d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id); 73d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id, 74d7579d12SMichal Kazior u32 param_id, u32 param_value); 75d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar, 76d7579d12SMichal Kazior const struct wmi_vdev_install_key_arg *arg); 77d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar, 78d7579d12SMichal Kazior const struct wmi_vdev_spectral_conf_arg *arg); 79d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id, 80d7579d12SMichal Kazior u32 trigger, u32 enable); 81d7579d12SMichal Kazior struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id, 82d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN]); 83d7579d12SMichal Kazior struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id, 84d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN]); 85d7579d12SMichal Kazior struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id, 86d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN], 87d7579d12SMichal Kazior u32 tid_bitmap); 88d7579d12SMichal Kazior struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id, 89d7579d12SMichal Kazior const u8 *peer_addr, 90d7579d12SMichal Kazior enum wmi_peer_param param_id, 91d7579d12SMichal Kazior u32 param_value); 92d7579d12SMichal Kazior struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar, 93d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg); 94d7579d12SMichal Kazior struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id, 95d7579d12SMichal Kazior enum wmi_sta_ps_mode psmode); 96d7579d12SMichal Kazior struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id, 97d7579d12SMichal Kazior enum wmi_sta_powersave_param param_id, 98d7579d12SMichal Kazior u32 value); 99d7579d12SMichal Kazior struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id, 100d7579d12SMichal Kazior const u8 *mac, 101d7579d12SMichal Kazior enum wmi_ap_ps_peer_param param_id, 102d7579d12SMichal Kazior u32 value); 103d7579d12SMichal Kazior struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar, 104d7579d12SMichal Kazior const struct wmi_scan_chan_list_arg *arg); 105d7579d12SMichal Kazior struct sk_buff *(*gen_beacon_dma)(struct ath10k_vif *arvif); 106d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar, 107d7579d12SMichal Kazior const struct wmi_pdev_set_wmm_params_arg *arg); 108d7579d12SMichal Kazior struct sk_buff *(*gen_request_stats)(struct ath10k *ar, 109d7579d12SMichal Kazior enum wmi_stats_id stats_id); 110d7579d12SMichal Kazior struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar, 111d7579d12SMichal Kazior enum wmi_force_fw_hang_type type, 112d7579d12SMichal Kazior u32 delay_ms); 113d7579d12SMichal Kazior struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb); 114d7579d12SMichal Kazior struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable); 115d7579d12SMichal Kazior struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter); 116d7579d12SMichal Kazior struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar); 117ffdd738dSRajkumar Manoharan struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar, 118ffdd738dSRajkumar Manoharan u32 period, u32 duration, 119ffdd738dSRajkumar Manoharan u32 next_offset, 120ffdd738dSRajkumar Manoharan u32 enabled); 121a57a6a27SRajkumar Manoharan struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar); 122d7579d12SMichal Kazior }; 123d7579d12SMichal Kazior 124d7579d12SMichal Kazior int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id); 125d7579d12SMichal Kazior 126d7579d12SMichal Kazior static inline int 127d7579d12SMichal Kazior ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb) 128d7579d12SMichal Kazior { 129d7579d12SMichal Kazior if (WARN_ON_ONCE(!ar->wmi.ops->rx)) 130d7579d12SMichal Kazior return -EOPNOTSUPP; 131d7579d12SMichal Kazior 132d7579d12SMichal Kazior ar->wmi.ops->rx(ar, skb); 133d7579d12SMichal Kazior return 0; 134d7579d12SMichal Kazior } 135d7579d12SMichal Kazior 136d7579d12SMichal Kazior static inline int 137d7579d12SMichal Kazior ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out, 138d7579d12SMichal Kazior size_t len) 139d7579d12SMichal Kazior { 140d7579d12SMichal Kazior if (!ar->wmi.ops->map_svc) 141d7579d12SMichal Kazior return -EOPNOTSUPP; 142d7579d12SMichal Kazior 143d7579d12SMichal Kazior ar->wmi.ops->map_svc(in, out, len); 144d7579d12SMichal Kazior return 0; 145d7579d12SMichal Kazior } 146d7579d12SMichal Kazior 147d7579d12SMichal Kazior static inline int 148d7579d12SMichal Kazior ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb, 149d7579d12SMichal Kazior struct wmi_scan_ev_arg *arg) 150d7579d12SMichal Kazior { 151d7579d12SMichal Kazior if (!ar->wmi.ops->pull_scan) 152d7579d12SMichal Kazior return -EOPNOTSUPP; 153d7579d12SMichal Kazior 154d7579d12SMichal Kazior return ar->wmi.ops->pull_scan(ar, skb, arg); 155d7579d12SMichal Kazior } 156d7579d12SMichal Kazior 157d7579d12SMichal Kazior static inline int 158d7579d12SMichal Kazior ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb, 159d7579d12SMichal Kazior struct wmi_mgmt_rx_ev_arg *arg) 160d7579d12SMichal Kazior { 161d7579d12SMichal Kazior if (!ar->wmi.ops->pull_mgmt_rx) 162d7579d12SMichal Kazior return -EOPNOTSUPP; 163d7579d12SMichal Kazior 164d7579d12SMichal Kazior return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg); 165d7579d12SMichal Kazior } 166d7579d12SMichal Kazior 167d7579d12SMichal Kazior static inline int 168d7579d12SMichal Kazior ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb, 169d7579d12SMichal Kazior struct wmi_ch_info_ev_arg *arg) 170d7579d12SMichal Kazior { 171d7579d12SMichal Kazior if (!ar->wmi.ops->pull_ch_info) 172d7579d12SMichal Kazior return -EOPNOTSUPP; 173d7579d12SMichal Kazior 174d7579d12SMichal Kazior return ar->wmi.ops->pull_ch_info(ar, skb, arg); 175d7579d12SMichal Kazior } 176d7579d12SMichal Kazior 177d7579d12SMichal Kazior static inline int 178d7579d12SMichal Kazior ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb, 179d7579d12SMichal Kazior struct wmi_vdev_start_ev_arg *arg) 180d7579d12SMichal Kazior { 181d7579d12SMichal Kazior if (!ar->wmi.ops->pull_vdev_start) 182d7579d12SMichal Kazior return -EOPNOTSUPP; 183d7579d12SMichal Kazior 184d7579d12SMichal Kazior return ar->wmi.ops->pull_vdev_start(ar, skb, arg); 185d7579d12SMichal Kazior } 186d7579d12SMichal Kazior 187d7579d12SMichal Kazior static inline int 188d7579d12SMichal Kazior ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb, 189d7579d12SMichal Kazior struct wmi_peer_kick_ev_arg *arg) 190d7579d12SMichal Kazior { 191d7579d12SMichal Kazior if (!ar->wmi.ops->pull_peer_kick) 192d7579d12SMichal Kazior return -EOPNOTSUPP; 193d7579d12SMichal Kazior 194d7579d12SMichal Kazior return ar->wmi.ops->pull_peer_kick(ar, skb, arg); 195d7579d12SMichal Kazior } 196d7579d12SMichal Kazior 197d7579d12SMichal Kazior static inline int 198d7579d12SMichal Kazior ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb, 199d7579d12SMichal Kazior struct wmi_swba_ev_arg *arg) 200d7579d12SMichal Kazior { 201d7579d12SMichal Kazior if (!ar->wmi.ops->pull_swba) 202d7579d12SMichal Kazior return -EOPNOTSUPP; 203d7579d12SMichal Kazior 204d7579d12SMichal Kazior return ar->wmi.ops->pull_swba(ar, skb, arg); 205d7579d12SMichal Kazior } 206d7579d12SMichal Kazior 207d7579d12SMichal Kazior static inline int 208d7579d12SMichal Kazior ath10k_wmi_pull_phyerr(struct ath10k *ar, struct sk_buff *skb, 209d7579d12SMichal Kazior struct wmi_phyerr_ev_arg *arg) 210d7579d12SMichal Kazior { 211d7579d12SMichal Kazior if (!ar->wmi.ops->pull_phyerr) 212d7579d12SMichal Kazior return -EOPNOTSUPP; 213d7579d12SMichal Kazior 214d7579d12SMichal Kazior return ar->wmi.ops->pull_phyerr(ar, skb, arg); 215d7579d12SMichal Kazior } 216d7579d12SMichal Kazior 217d7579d12SMichal Kazior static inline int 218d7579d12SMichal Kazior ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb, 219d7579d12SMichal Kazior struct wmi_svc_rdy_ev_arg *arg) 220d7579d12SMichal Kazior { 221d7579d12SMichal Kazior if (!ar->wmi.ops->pull_svc_rdy) 222d7579d12SMichal Kazior return -EOPNOTSUPP; 223d7579d12SMichal Kazior 224d7579d12SMichal Kazior return ar->wmi.ops->pull_svc_rdy(ar, skb, arg); 225d7579d12SMichal Kazior } 226d7579d12SMichal Kazior 227d7579d12SMichal Kazior static inline int 228d7579d12SMichal Kazior ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb, 229d7579d12SMichal Kazior struct wmi_rdy_ev_arg *arg) 230d7579d12SMichal Kazior { 231d7579d12SMichal Kazior if (!ar->wmi.ops->pull_rdy) 232d7579d12SMichal Kazior return -EOPNOTSUPP; 233d7579d12SMichal Kazior 234d7579d12SMichal Kazior return ar->wmi.ops->pull_rdy(ar, skb, arg); 235d7579d12SMichal Kazior } 236d7579d12SMichal Kazior 237d7579d12SMichal Kazior static inline int 238d7579d12SMichal Kazior ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb, 239d7579d12SMichal Kazior struct ath10k_fw_stats *stats) 240d7579d12SMichal Kazior { 241d7579d12SMichal Kazior if (!ar->wmi.ops->pull_fw_stats) 242d7579d12SMichal Kazior return -EOPNOTSUPP; 243d7579d12SMichal Kazior 244d7579d12SMichal Kazior return ar->wmi.ops->pull_fw_stats(ar, skb, stats); 245d7579d12SMichal Kazior } 246d7579d12SMichal Kazior 247d7579d12SMichal Kazior static inline int 248d7579d12SMichal Kazior ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) 249d7579d12SMichal Kazior { 250d7579d12SMichal Kazior struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu); 251d7579d12SMichal Kazior struct sk_buff *skb; 252d7579d12SMichal Kazior int ret; 253d7579d12SMichal Kazior 254d7579d12SMichal Kazior if (!ar->wmi.ops->gen_mgmt_tx) 255d7579d12SMichal Kazior return -EOPNOTSUPP; 256d7579d12SMichal Kazior 257d7579d12SMichal Kazior skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu); 258d7579d12SMichal Kazior if (IS_ERR(skb)) 259d7579d12SMichal Kazior return PTR_ERR(skb); 260d7579d12SMichal Kazior 261d7579d12SMichal Kazior ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid); 262d7579d12SMichal Kazior if (ret) 263d7579d12SMichal Kazior return ret; 264d7579d12SMichal Kazior 265d7579d12SMichal Kazior /* FIXME There's no ACK event for Management Tx. This probably 266d7579d12SMichal Kazior * shouldn't be called here either. */ 267d7579d12SMichal Kazior info->flags |= IEEE80211_TX_STAT_ACK; 268d7579d12SMichal Kazior ieee80211_tx_status_irqsafe(ar->hw, msdu); 269d7579d12SMichal Kazior 270d7579d12SMichal Kazior return 0; 271d7579d12SMichal Kazior } 272d7579d12SMichal Kazior 273d7579d12SMichal Kazior static inline int 274d7579d12SMichal Kazior ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g, 275d7579d12SMichal Kazior u16 ctl2g, u16 ctl5g, 276d7579d12SMichal Kazior enum wmi_dfs_region dfs_reg) 277d7579d12SMichal Kazior { 278d7579d12SMichal Kazior struct sk_buff *skb; 279d7579d12SMichal Kazior 280d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_set_rd) 281d7579d12SMichal Kazior return -EOPNOTSUPP; 282d7579d12SMichal Kazior 283d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g, 284d7579d12SMichal Kazior dfs_reg); 285d7579d12SMichal Kazior if (IS_ERR(skb)) 286d7579d12SMichal Kazior return PTR_ERR(skb); 287d7579d12SMichal Kazior 288d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 289d7579d12SMichal Kazior ar->wmi.cmd->pdev_set_regdomain_cmdid); 290d7579d12SMichal Kazior } 291d7579d12SMichal Kazior 292d7579d12SMichal Kazior static inline int 293d7579d12SMichal Kazior ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt) 294d7579d12SMichal Kazior { 295d7579d12SMichal Kazior struct sk_buff *skb; 296d7579d12SMichal Kazior 297d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_suspend) 298d7579d12SMichal Kazior return -EOPNOTSUPP; 299d7579d12SMichal Kazior 300d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt); 301d7579d12SMichal Kazior if (IS_ERR(skb)) 302d7579d12SMichal Kazior return PTR_ERR(skb); 303d7579d12SMichal Kazior 304d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid); 305d7579d12SMichal Kazior } 306d7579d12SMichal Kazior 307d7579d12SMichal Kazior static inline int 308d7579d12SMichal Kazior ath10k_wmi_pdev_resume_target(struct ath10k *ar) 309d7579d12SMichal Kazior { 310d7579d12SMichal Kazior struct sk_buff *skb; 311d7579d12SMichal Kazior 312d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_resume) 313d7579d12SMichal Kazior return -EOPNOTSUPP; 314d7579d12SMichal Kazior 315d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_resume(ar); 316d7579d12SMichal Kazior if (IS_ERR(skb)) 317d7579d12SMichal Kazior return PTR_ERR(skb); 318d7579d12SMichal Kazior 319d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid); 320d7579d12SMichal Kazior } 321d7579d12SMichal Kazior 322d7579d12SMichal Kazior static inline int 323d7579d12SMichal Kazior ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value) 324d7579d12SMichal Kazior { 325d7579d12SMichal Kazior struct sk_buff *skb; 326d7579d12SMichal Kazior 327d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_set_param) 328d7579d12SMichal Kazior return -EOPNOTSUPP; 329d7579d12SMichal Kazior 330d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value); 331d7579d12SMichal Kazior if (IS_ERR(skb)) 332d7579d12SMichal Kazior return PTR_ERR(skb); 333d7579d12SMichal Kazior 334d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid); 335d7579d12SMichal Kazior } 336d7579d12SMichal Kazior 337d7579d12SMichal Kazior static inline int 338d7579d12SMichal Kazior ath10k_wmi_cmd_init(struct ath10k *ar) 339d7579d12SMichal Kazior { 340d7579d12SMichal Kazior struct sk_buff *skb; 341d7579d12SMichal Kazior 342d7579d12SMichal Kazior if (!ar->wmi.ops->gen_init) 343d7579d12SMichal Kazior return -EOPNOTSUPP; 344d7579d12SMichal Kazior 345d7579d12SMichal Kazior skb = ar->wmi.ops->gen_init(ar); 346d7579d12SMichal Kazior if (IS_ERR(skb)) 347d7579d12SMichal Kazior return PTR_ERR(skb); 348d7579d12SMichal Kazior 349d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid); 350d7579d12SMichal Kazior } 351d7579d12SMichal Kazior 352d7579d12SMichal Kazior static inline int 353d7579d12SMichal Kazior ath10k_wmi_start_scan(struct ath10k *ar, 354d7579d12SMichal Kazior const struct wmi_start_scan_arg *arg) 355d7579d12SMichal Kazior { 356d7579d12SMichal Kazior struct sk_buff *skb; 357d7579d12SMichal Kazior 358d7579d12SMichal Kazior if (!ar->wmi.ops->gen_start_scan) 359d7579d12SMichal Kazior return -EOPNOTSUPP; 360d7579d12SMichal Kazior 361d7579d12SMichal Kazior skb = ar->wmi.ops->gen_start_scan(ar, arg); 362d7579d12SMichal Kazior if (IS_ERR(skb)) 363d7579d12SMichal Kazior return PTR_ERR(skb); 364d7579d12SMichal Kazior 365d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid); 366d7579d12SMichal Kazior } 367d7579d12SMichal Kazior 368d7579d12SMichal Kazior static inline int 369d7579d12SMichal Kazior ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg) 370d7579d12SMichal Kazior { 371d7579d12SMichal Kazior struct sk_buff *skb; 372d7579d12SMichal Kazior 373d7579d12SMichal Kazior if (!ar->wmi.ops->gen_stop_scan) 374d7579d12SMichal Kazior return -EOPNOTSUPP; 375d7579d12SMichal Kazior 376d7579d12SMichal Kazior skb = ar->wmi.ops->gen_stop_scan(ar, arg); 377d7579d12SMichal Kazior if (IS_ERR(skb)) 378d7579d12SMichal Kazior return PTR_ERR(skb); 379d7579d12SMichal Kazior 380d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid); 381d7579d12SMichal Kazior } 382d7579d12SMichal Kazior 383d7579d12SMichal Kazior static inline int 384d7579d12SMichal Kazior ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id, 385d7579d12SMichal Kazior enum wmi_vdev_type type, 386d7579d12SMichal Kazior enum wmi_vdev_subtype subtype, 387d7579d12SMichal Kazior const u8 macaddr[ETH_ALEN]) 388d7579d12SMichal Kazior { 389d7579d12SMichal Kazior struct sk_buff *skb; 390d7579d12SMichal Kazior 391d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_create) 392d7579d12SMichal Kazior return -EOPNOTSUPP; 393d7579d12SMichal Kazior 394d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr); 395d7579d12SMichal Kazior if (IS_ERR(skb)) 396d7579d12SMichal Kazior return PTR_ERR(skb); 397d7579d12SMichal Kazior 398d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid); 399d7579d12SMichal Kazior } 400d7579d12SMichal Kazior 401d7579d12SMichal Kazior static inline int 402d7579d12SMichal Kazior ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id) 403d7579d12SMichal Kazior { 404d7579d12SMichal Kazior struct sk_buff *skb; 405d7579d12SMichal Kazior 406d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_delete) 407d7579d12SMichal Kazior return -EOPNOTSUPP; 408d7579d12SMichal Kazior 409d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id); 410d7579d12SMichal Kazior if (IS_ERR(skb)) 411d7579d12SMichal Kazior return PTR_ERR(skb); 412d7579d12SMichal Kazior 413d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid); 414d7579d12SMichal Kazior } 415d7579d12SMichal Kazior 416d7579d12SMichal Kazior static inline int 417d7579d12SMichal Kazior ath10k_wmi_vdev_start(struct ath10k *ar, 418d7579d12SMichal Kazior const struct wmi_vdev_start_request_arg *arg) 419d7579d12SMichal Kazior { 420d7579d12SMichal Kazior struct sk_buff *skb; 421d7579d12SMichal Kazior 422d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_start) 423d7579d12SMichal Kazior return -EOPNOTSUPP; 424d7579d12SMichal Kazior 425d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_start(ar, arg, false); 426d7579d12SMichal Kazior if (IS_ERR(skb)) 427d7579d12SMichal Kazior return PTR_ERR(skb); 428d7579d12SMichal Kazior 429d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 430d7579d12SMichal Kazior ar->wmi.cmd->vdev_start_request_cmdid); 431d7579d12SMichal Kazior } 432d7579d12SMichal Kazior 433d7579d12SMichal Kazior static inline int 434d7579d12SMichal Kazior ath10k_wmi_vdev_restart(struct ath10k *ar, 435d7579d12SMichal Kazior const struct wmi_vdev_start_request_arg *arg) 436d7579d12SMichal Kazior { 437d7579d12SMichal Kazior struct sk_buff *skb; 438d7579d12SMichal Kazior 439d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_start) 440d7579d12SMichal Kazior return -EOPNOTSUPP; 441d7579d12SMichal Kazior 442d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_start(ar, arg, true); 443d7579d12SMichal Kazior if (IS_ERR(skb)) 444d7579d12SMichal Kazior return PTR_ERR(skb); 445d7579d12SMichal Kazior 446d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 447d7579d12SMichal Kazior ar->wmi.cmd->vdev_restart_request_cmdid); 448d7579d12SMichal Kazior } 449d7579d12SMichal Kazior 450d7579d12SMichal Kazior static inline int 451d7579d12SMichal Kazior ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id) 452d7579d12SMichal Kazior { 453d7579d12SMichal Kazior struct sk_buff *skb; 454d7579d12SMichal Kazior 455d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_stop) 456d7579d12SMichal Kazior return -EOPNOTSUPP; 457d7579d12SMichal Kazior 458d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id); 459d7579d12SMichal Kazior if (IS_ERR(skb)) 460d7579d12SMichal Kazior return PTR_ERR(skb); 461d7579d12SMichal Kazior 462d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid); 463d7579d12SMichal Kazior } 464d7579d12SMichal Kazior 465d7579d12SMichal Kazior static inline int 466d7579d12SMichal Kazior ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid) 467d7579d12SMichal Kazior { 468d7579d12SMichal Kazior struct sk_buff *skb; 469d7579d12SMichal Kazior 470d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_up) 471d7579d12SMichal Kazior return -EOPNOTSUPP; 472d7579d12SMichal Kazior 473d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid); 474d7579d12SMichal Kazior if (IS_ERR(skb)) 475d7579d12SMichal Kazior return PTR_ERR(skb); 476d7579d12SMichal Kazior 477d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid); 478d7579d12SMichal Kazior } 479d7579d12SMichal Kazior 480d7579d12SMichal Kazior static inline int 481d7579d12SMichal Kazior ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id) 482d7579d12SMichal Kazior { 483d7579d12SMichal Kazior struct sk_buff *skb; 484d7579d12SMichal Kazior 485d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_down) 486d7579d12SMichal Kazior return -EOPNOTSUPP; 487d7579d12SMichal Kazior 488d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id); 489d7579d12SMichal Kazior if (IS_ERR(skb)) 490d7579d12SMichal Kazior return PTR_ERR(skb); 491d7579d12SMichal Kazior 492d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid); 493d7579d12SMichal Kazior } 494d7579d12SMichal Kazior 495d7579d12SMichal Kazior static inline int 496d7579d12SMichal Kazior ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id, 497d7579d12SMichal Kazior u32 param_value) 498d7579d12SMichal Kazior { 499d7579d12SMichal Kazior struct sk_buff *skb; 500d7579d12SMichal Kazior 501d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_set_param) 502d7579d12SMichal Kazior return -EOPNOTSUPP; 503d7579d12SMichal Kazior 504d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id, 505d7579d12SMichal Kazior param_value); 506d7579d12SMichal Kazior if (IS_ERR(skb)) 507d7579d12SMichal Kazior return PTR_ERR(skb); 508d7579d12SMichal Kazior 509d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid); 510d7579d12SMichal Kazior } 511d7579d12SMichal Kazior 512d7579d12SMichal Kazior static inline int 513d7579d12SMichal Kazior ath10k_wmi_vdev_install_key(struct ath10k *ar, 514d7579d12SMichal Kazior const struct wmi_vdev_install_key_arg *arg) 515d7579d12SMichal Kazior { 516d7579d12SMichal Kazior struct sk_buff *skb; 517d7579d12SMichal Kazior 518d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_install_key) 519d7579d12SMichal Kazior return -EOPNOTSUPP; 520d7579d12SMichal Kazior 521d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_install_key(ar, arg); 522d7579d12SMichal Kazior if (IS_ERR(skb)) 523d7579d12SMichal Kazior return PTR_ERR(skb); 524d7579d12SMichal Kazior 525d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 526d7579d12SMichal Kazior ar->wmi.cmd->vdev_install_key_cmdid); 527d7579d12SMichal Kazior } 528d7579d12SMichal Kazior 529d7579d12SMichal Kazior static inline int 530d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_conf(struct ath10k *ar, 531d7579d12SMichal Kazior const struct wmi_vdev_spectral_conf_arg *arg) 532d7579d12SMichal Kazior { 533d7579d12SMichal Kazior struct sk_buff *skb; 534d7579d12SMichal Kazior u32 cmd_id; 535d7579d12SMichal Kazior 536d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg); 537d7579d12SMichal Kazior if (IS_ERR(skb)) 538d7579d12SMichal Kazior return PTR_ERR(skb); 539d7579d12SMichal Kazior 540d7579d12SMichal Kazior cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid; 541d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, cmd_id); 542d7579d12SMichal Kazior } 543d7579d12SMichal Kazior 544d7579d12SMichal Kazior static inline int 545d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger, 546d7579d12SMichal Kazior u32 enable) 547d7579d12SMichal Kazior { 548d7579d12SMichal Kazior struct sk_buff *skb; 549d7579d12SMichal Kazior u32 cmd_id; 550d7579d12SMichal Kazior 551d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger, 552d7579d12SMichal Kazior enable); 553d7579d12SMichal Kazior if (IS_ERR(skb)) 554d7579d12SMichal Kazior return PTR_ERR(skb); 555d7579d12SMichal Kazior 556d7579d12SMichal Kazior cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid; 557d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, cmd_id); 558d7579d12SMichal Kazior } 559d7579d12SMichal Kazior 560d7579d12SMichal Kazior static inline int 561d7579d12SMichal Kazior ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id, 562d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN]) 563d7579d12SMichal Kazior { 564d7579d12SMichal Kazior struct sk_buff *skb; 565d7579d12SMichal Kazior 566d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_create) 567d7579d12SMichal Kazior return -EOPNOTSUPP; 568d7579d12SMichal Kazior 569d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr); 570d7579d12SMichal Kazior if (IS_ERR(skb)) 571d7579d12SMichal Kazior return PTR_ERR(skb); 572d7579d12SMichal Kazior 573d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid); 574d7579d12SMichal Kazior } 575d7579d12SMichal Kazior 576d7579d12SMichal Kazior static inline int 577d7579d12SMichal Kazior ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id, 578d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN]) 579d7579d12SMichal Kazior { 580d7579d12SMichal Kazior struct sk_buff *skb; 581d7579d12SMichal Kazior 582d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_delete) 583d7579d12SMichal Kazior return -EOPNOTSUPP; 584d7579d12SMichal Kazior 585d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr); 586d7579d12SMichal Kazior if (IS_ERR(skb)) 587d7579d12SMichal Kazior return PTR_ERR(skb); 588d7579d12SMichal Kazior 589d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid); 590d7579d12SMichal Kazior } 591d7579d12SMichal Kazior 592d7579d12SMichal Kazior static inline int 593d7579d12SMichal Kazior ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id, 594d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN], u32 tid_bitmap) 595d7579d12SMichal Kazior { 596d7579d12SMichal Kazior struct sk_buff *skb; 597d7579d12SMichal Kazior 598d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_flush) 599d7579d12SMichal Kazior return -EOPNOTSUPP; 600d7579d12SMichal Kazior 601d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap); 602d7579d12SMichal Kazior if (IS_ERR(skb)) 603d7579d12SMichal Kazior return PTR_ERR(skb); 604d7579d12SMichal Kazior 605d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid); 606d7579d12SMichal Kazior } 607d7579d12SMichal Kazior 608d7579d12SMichal Kazior static inline int 609d7579d12SMichal Kazior ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr, 610d7579d12SMichal Kazior enum wmi_peer_param param_id, u32 param_value) 611d7579d12SMichal Kazior { 612d7579d12SMichal Kazior struct sk_buff *skb; 613d7579d12SMichal Kazior 614d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_set_param) 615d7579d12SMichal Kazior return -EOPNOTSUPP; 616d7579d12SMichal Kazior 617d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id, 618d7579d12SMichal Kazior param_value); 619d7579d12SMichal Kazior if (IS_ERR(skb)) 620d7579d12SMichal Kazior return PTR_ERR(skb); 621d7579d12SMichal Kazior 622d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid); 623d7579d12SMichal Kazior } 624d7579d12SMichal Kazior 625d7579d12SMichal Kazior static inline int 626d7579d12SMichal Kazior ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id, 627d7579d12SMichal Kazior enum wmi_sta_ps_mode psmode) 628d7579d12SMichal Kazior { 629d7579d12SMichal Kazior struct sk_buff *skb; 630d7579d12SMichal Kazior 631d7579d12SMichal Kazior if (!ar->wmi.ops->gen_set_psmode) 632d7579d12SMichal Kazior return -EOPNOTSUPP; 633d7579d12SMichal Kazior 634d7579d12SMichal Kazior skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode); 635d7579d12SMichal Kazior if (IS_ERR(skb)) 636d7579d12SMichal Kazior return PTR_ERR(skb); 637d7579d12SMichal Kazior 638d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 639d7579d12SMichal Kazior ar->wmi.cmd->sta_powersave_mode_cmdid); 640d7579d12SMichal Kazior } 641d7579d12SMichal Kazior 642d7579d12SMichal Kazior static inline int 643d7579d12SMichal Kazior ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id, 644d7579d12SMichal Kazior enum wmi_sta_powersave_param param_id, u32 value) 645d7579d12SMichal Kazior { 646d7579d12SMichal Kazior struct sk_buff *skb; 647d7579d12SMichal Kazior 648d7579d12SMichal Kazior if (!ar->wmi.ops->gen_set_sta_ps) 649d7579d12SMichal Kazior return -EOPNOTSUPP; 650d7579d12SMichal Kazior 651d7579d12SMichal Kazior skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value); 652d7579d12SMichal Kazior if (IS_ERR(skb)) 653d7579d12SMichal Kazior return PTR_ERR(skb); 654d7579d12SMichal Kazior 655d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 656d7579d12SMichal Kazior ar->wmi.cmd->sta_powersave_param_cmdid); 657d7579d12SMichal Kazior } 658d7579d12SMichal Kazior 659d7579d12SMichal Kazior static inline int 660d7579d12SMichal Kazior ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac, 661d7579d12SMichal Kazior enum wmi_ap_ps_peer_param param_id, u32 value) 662d7579d12SMichal Kazior { 663d7579d12SMichal Kazior struct sk_buff *skb; 664d7579d12SMichal Kazior 665d7579d12SMichal Kazior if (!ar->wmi.ops->gen_set_ap_ps) 666d7579d12SMichal Kazior return -EOPNOTSUPP; 667d7579d12SMichal Kazior 668d7579d12SMichal Kazior skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value); 669d7579d12SMichal Kazior if (IS_ERR(skb)) 670d7579d12SMichal Kazior return PTR_ERR(skb); 671d7579d12SMichal Kazior 672d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 673d7579d12SMichal Kazior ar->wmi.cmd->ap_ps_peer_param_cmdid); 674d7579d12SMichal Kazior } 675d7579d12SMichal Kazior 676d7579d12SMichal Kazior static inline int 677d7579d12SMichal Kazior ath10k_wmi_scan_chan_list(struct ath10k *ar, 678d7579d12SMichal Kazior const struct wmi_scan_chan_list_arg *arg) 679d7579d12SMichal Kazior { 680d7579d12SMichal Kazior struct sk_buff *skb; 681d7579d12SMichal Kazior 682d7579d12SMichal Kazior if (!ar->wmi.ops->gen_scan_chan_list) 683d7579d12SMichal Kazior return -EOPNOTSUPP; 684d7579d12SMichal Kazior 685d7579d12SMichal Kazior skb = ar->wmi.ops->gen_scan_chan_list(ar, arg); 686d7579d12SMichal Kazior if (IS_ERR(skb)) 687d7579d12SMichal Kazior return PTR_ERR(skb); 688d7579d12SMichal Kazior 689d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid); 690d7579d12SMichal Kazior } 691d7579d12SMichal Kazior 692d7579d12SMichal Kazior static inline int 693d7579d12SMichal Kazior ath10k_wmi_peer_assoc(struct ath10k *ar, 694d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 695d7579d12SMichal Kazior { 696d7579d12SMichal Kazior struct sk_buff *skb; 697d7579d12SMichal Kazior 698d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_assoc) 699d7579d12SMichal Kazior return -EOPNOTSUPP; 700d7579d12SMichal Kazior 701d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_assoc(ar, arg); 702d7579d12SMichal Kazior if (IS_ERR(skb)) 703d7579d12SMichal Kazior return PTR_ERR(skb); 704d7579d12SMichal Kazior 705d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid); 706d7579d12SMichal Kazior } 707d7579d12SMichal Kazior 708d7579d12SMichal Kazior static inline int 709d7579d12SMichal Kazior ath10k_wmi_beacon_send_ref_nowait(struct ath10k_vif *arvif) 710d7579d12SMichal Kazior { 711d7579d12SMichal Kazior struct ath10k *ar = arvif->ar; 712d7579d12SMichal Kazior struct sk_buff *skb; 713d7579d12SMichal Kazior int ret; 714d7579d12SMichal Kazior 715d7579d12SMichal Kazior if (!ar->wmi.ops->gen_beacon_dma) 716d7579d12SMichal Kazior return -EOPNOTSUPP; 717d7579d12SMichal Kazior 718d7579d12SMichal Kazior skb = ar->wmi.ops->gen_beacon_dma(arvif); 719d7579d12SMichal Kazior if (IS_ERR(skb)) 720d7579d12SMichal Kazior return PTR_ERR(skb); 721d7579d12SMichal Kazior 722d7579d12SMichal Kazior ret = ath10k_wmi_cmd_send_nowait(ar, skb, 723d7579d12SMichal Kazior ar->wmi.cmd->pdev_send_bcn_cmdid); 724d7579d12SMichal Kazior if (ret) { 725d7579d12SMichal Kazior dev_kfree_skb(skb); 726d7579d12SMichal Kazior return ret; 727d7579d12SMichal Kazior } 728d7579d12SMichal Kazior 729d7579d12SMichal Kazior return 0; 730d7579d12SMichal Kazior } 731d7579d12SMichal Kazior 732d7579d12SMichal Kazior static inline int 733d7579d12SMichal Kazior ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar, 734d7579d12SMichal Kazior const struct wmi_pdev_set_wmm_params_arg *arg) 735d7579d12SMichal Kazior { 736d7579d12SMichal Kazior struct sk_buff *skb; 737d7579d12SMichal Kazior 738d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_set_wmm) 739d7579d12SMichal Kazior return -EOPNOTSUPP; 740d7579d12SMichal Kazior 741d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg); 742d7579d12SMichal Kazior if (IS_ERR(skb)) 743d7579d12SMichal Kazior return PTR_ERR(skb); 744d7579d12SMichal Kazior 745d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 746d7579d12SMichal Kazior ar->wmi.cmd->pdev_set_wmm_params_cmdid); 747d7579d12SMichal Kazior } 748d7579d12SMichal Kazior 749d7579d12SMichal Kazior static inline int 750d7579d12SMichal Kazior ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id) 751d7579d12SMichal Kazior { 752d7579d12SMichal Kazior struct sk_buff *skb; 753d7579d12SMichal Kazior 754d7579d12SMichal Kazior if (!ar->wmi.ops->gen_request_stats) 755d7579d12SMichal Kazior return -EOPNOTSUPP; 756d7579d12SMichal Kazior 757d7579d12SMichal Kazior skb = ar->wmi.ops->gen_request_stats(ar, stats_id); 758d7579d12SMichal Kazior if (IS_ERR(skb)) 759d7579d12SMichal Kazior return PTR_ERR(skb); 760d7579d12SMichal Kazior 761d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid); 762d7579d12SMichal Kazior } 763d7579d12SMichal Kazior 764d7579d12SMichal Kazior static inline int 765d7579d12SMichal Kazior ath10k_wmi_force_fw_hang(struct ath10k *ar, 766d7579d12SMichal Kazior enum wmi_force_fw_hang_type type, u32 delay_ms) 767d7579d12SMichal Kazior { 768d7579d12SMichal Kazior struct sk_buff *skb; 769d7579d12SMichal Kazior 770d7579d12SMichal Kazior if (!ar->wmi.ops->gen_force_fw_hang) 771d7579d12SMichal Kazior return -EOPNOTSUPP; 772d7579d12SMichal Kazior 773d7579d12SMichal Kazior skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms); 774d7579d12SMichal Kazior if (IS_ERR(skb)) 775d7579d12SMichal Kazior return PTR_ERR(skb); 776d7579d12SMichal Kazior 777d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid); 778d7579d12SMichal Kazior } 779d7579d12SMichal Kazior 780d7579d12SMichal Kazior static inline int 781d7579d12SMichal Kazior ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable) 782d7579d12SMichal Kazior { 783d7579d12SMichal Kazior struct sk_buff *skb; 784d7579d12SMichal Kazior 785d7579d12SMichal Kazior if (!ar->wmi.ops->gen_dbglog_cfg) 786d7579d12SMichal Kazior return -EOPNOTSUPP; 787d7579d12SMichal Kazior 788d7579d12SMichal Kazior skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable); 789d7579d12SMichal Kazior if (IS_ERR(skb)) 790d7579d12SMichal Kazior return PTR_ERR(skb); 791d7579d12SMichal Kazior 792d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid); 793d7579d12SMichal Kazior } 794d7579d12SMichal Kazior 795d7579d12SMichal Kazior static inline int 796d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter) 797d7579d12SMichal Kazior { 798d7579d12SMichal Kazior struct sk_buff *skb; 799d7579d12SMichal Kazior 800d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pktlog_enable) 801d7579d12SMichal Kazior return -EOPNOTSUPP; 802d7579d12SMichal Kazior 803d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pktlog_enable(ar, filter); 804d7579d12SMichal Kazior if (IS_ERR(skb)) 805d7579d12SMichal Kazior return PTR_ERR(skb); 806d7579d12SMichal Kazior 807d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid); 808d7579d12SMichal Kazior } 809d7579d12SMichal Kazior 810d7579d12SMichal Kazior static inline int 811d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar) 812d7579d12SMichal Kazior { 813d7579d12SMichal Kazior struct sk_buff *skb; 814d7579d12SMichal Kazior 815d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pktlog_disable) 816d7579d12SMichal Kazior return -EOPNOTSUPP; 817d7579d12SMichal Kazior 818d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pktlog_disable(ar); 819d7579d12SMichal Kazior if (IS_ERR(skb)) 820d7579d12SMichal Kazior return PTR_ERR(skb); 821d7579d12SMichal Kazior 822d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 823d7579d12SMichal Kazior ar->wmi.cmd->pdev_pktlog_disable_cmdid); 824d7579d12SMichal Kazior } 825d7579d12SMichal Kazior 826ffdd738dSRajkumar Manoharan static inline int 827ffdd738dSRajkumar Manoharan ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration, 828ffdd738dSRajkumar Manoharan u32 next_offset, u32 enabled) 829ffdd738dSRajkumar Manoharan { 830ffdd738dSRajkumar Manoharan struct sk_buff *skb; 831ffdd738dSRajkumar Manoharan 832ffdd738dSRajkumar Manoharan if (!ar->wmi.ops->gen_pdev_set_quiet_mode) 833ffdd738dSRajkumar Manoharan return -EOPNOTSUPP; 834ffdd738dSRajkumar Manoharan 835ffdd738dSRajkumar Manoharan skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration, 836ffdd738dSRajkumar Manoharan next_offset, enabled); 837ffdd738dSRajkumar Manoharan if (IS_ERR(skb)) 838ffdd738dSRajkumar Manoharan return PTR_ERR(skb); 839ffdd738dSRajkumar Manoharan 840ffdd738dSRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 841ffdd738dSRajkumar Manoharan ar->wmi.cmd->pdev_set_quiet_mode_cmdid); 842ffdd738dSRajkumar Manoharan } 843ffdd738dSRajkumar Manoharan 844a57a6a27SRajkumar Manoharan static inline int 845a57a6a27SRajkumar Manoharan ath10k_wmi_pdev_get_temperature(struct ath10k *ar) 846a57a6a27SRajkumar Manoharan { 847a57a6a27SRajkumar Manoharan struct sk_buff *skb; 848a57a6a27SRajkumar Manoharan 849a57a6a27SRajkumar Manoharan if (!ar->wmi.ops->gen_pdev_get_temperature) 850a57a6a27SRajkumar Manoharan return -EOPNOTSUPP; 851a57a6a27SRajkumar Manoharan 852a57a6a27SRajkumar Manoharan skb = ar->wmi.ops->gen_pdev_get_temperature(ar); 853a57a6a27SRajkumar Manoharan if (IS_ERR(skb)) 854a57a6a27SRajkumar Manoharan return PTR_ERR(skb); 855a57a6a27SRajkumar Manoharan 856a57a6a27SRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 857a57a6a27SRajkumar Manoharan ar->wmi.cmd->pdev_get_temperature_cmdid); 858a57a6a27SRajkumar Manoharan } 859a57a6a27SRajkumar Manoharan 860d7579d12SMichal Kazior #endif 861