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); 40991adf71SRaja Mani int (*pull_phyerr_hdr)(struct ath10k *ar, struct sk_buff *skb, 41991adf71SRaja Mani struct wmi_phyerr_hdr_arg *arg); 42991adf71SRaja Mani int (*pull_phyerr)(struct ath10k *ar, const void *phyerr_buf, 43991adf71SRaja Mani int left_len, struct wmi_phyerr_ev_arg *arg); 44d7579d12SMichal Kazior int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb, 45d7579d12SMichal Kazior struct wmi_svc_rdy_ev_arg *arg); 46d7579d12SMichal Kazior int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb, 47d7579d12SMichal Kazior struct wmi_rdy_ev_arg *arg); 48d7579d12SMichal Kazior int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb, 49d7579d12SMichal Kazior struct ath10k_fw_stats *stats); 50c1a4654aSMichal Kazior int (*pull_roam_ev)(struct ath10k *ar, struct sk_buff *skb, 51c1a4654aSMichal Kazior struct wmi_roam_ev_arg *arg); 52f5431e87SJanusz Dziedzic int (*pull_wow_event)(struct ath10k *ar, struct sk_buff *skb, 53f5431e87SJanusz Dziedzic struct wmi_wow_ev_arg *arg); 5408e75ea8SVivek Natarajan enum wmi_txbf_conf (*get_txbf_conf_scheme)(struct ath10k *ar); 55d7579d12SMichal Kazior 56d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt); 57d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar); 58d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g, 59d7579d12SMichal Kazior u16 rd5g, u16 ctl2g, u16 ctl5g, 60d7579d12SMichal Kazior enum wmi_dfs_region dfs_reg); 61d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id, 62d7579d12SMichal Kazior u32 value); 63d7579d12SMichal Kazior struct sk_buff *(*gen_init)(struct ath10k *ar); 64d7579d12SMichal Kazior struct sk_buff *(*gen_start_scan)(struct ath10k *ar, 65d7579d12SMichal Kazior const struct wmi_start_scan_arg *arg); 66d7579d12SMichal Kazior struct sk_buff *(*gen_stop_scan)(struct ath10k *ar, 67d7579d12SMichal Kazior const struct wmi_stop_scan_arg *arg); 68d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id, 69d7579d12SMichal Kazior enum wmi_vdev_type type, 70d7579d12SMichal Kazior enum wmi_vdev_subtype subtype, 71d7579d12SMichal Kazior const u8 macaddr[ETH_ALEN]); 72d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id); 73d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_start)(struct ath10k *ar, 74d7579d12SMichal Kazior const struct wmi_vdev_start_request_arg *arg, 75d7579d12SMichal Kazior bool restart); 76d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id); 77d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid, 78d7579d12SMichal Kazior const u8 *bssid); 79d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id); 80d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id, 81d7579d12SMichal Kazior u32 param_id, u32 param_value); 82d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar, 83d7579d12SMichal Kazior const struct wmi_vdev_install_key_arg *arg); 84d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar, 85d7579d12SMichal Kazior const struct wmi_vdev_spectral_conf_arg *arg); 86d7579d12SMichal Kazior struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id, 87d7579d12SMichal Kazior u32 trigger, u32 enable); 886d492fe2SMichal Kazior struct sk_buff *(*gen_vdev_wmm_conf)(struct ath10k *ar, u32 vdev_id, 896d492fe2SMichal Kazior const struct wmi_wmm_params_all_arg *arg); 90d7579d12SMichal Kazior struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id, 917390ed34SMarek Puzyniak const u8 peer_addr[ETH_ALEN], 927390ed34SMarek Puzyniak enum wmi_peer_type peer_type); 93d7579d12SMichal Kazior struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id, 94d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN]); 95d7579d12SMichal Kazior struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id, 96d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN], 97d7579d12SMichal Kazior u32 tid_bitmap); 98d7579d12SMichal Kazior struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id, 99d7579d12SMichal Kazior const u8 *peer_addr, 100d7579d12SMichal Kazior enum wmi_peer_param param_id, 101d7579d12SMichal Kazior u32 param_value); 102d7579d12SMichal Kazior struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar, 103d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg); 104d7579d12SMichal Kazior struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id, 105d7579d12SMichal Kazior enum wmi_sta_ps_mode psmode); 106d7579d12SMichal Kazior struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id, 107d7579d12SMichal Kazior enum wmi_sta_powersave_param param_id, 108d7579d12SMichal Kazior u32 value); 109d7579d12SMichal Kazior struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id, 110d7579d12SMichal Kazior const u8 *mac, 111d7579d12SMichal Kazior enum wmi_ap_ps_peer_param param_id, 112d7579d12SMichal Kazior u32 value); 113d7579d12SMichal Kazior struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar, 114d7579d12SMichal Kazior const struct wmi_scan_chan_list_arg *arg); 1159ad50182SMichal Kazior struct sk_buff *(*gen_beacon_dma)(struct ath10k *ar, u32 vdev_id, 1169ad50182SMichal Kazior const void *bcn, size_t bcn_len, 1179ad50182SMichal Kazior u32 bcn_paddr, bool dtim_zero, 1189ad50182SMichal Kazior bool deliver_cab); 119d7579d12SMichal Kazior struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar, 1205e752e42SMichal Kazior const struct wmi_wmm_params_all_arg *arg); 121de23d3efSMichal Kazior struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask); 122d7579d12SMichal Kazior struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar, 123d7579d12SMichal Kazior enum wmi_force_fw_hang_type type, 124d7579d12SMichal Kazior u32 delay_ms); 125d7579d12SMichal Kazior struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb); 126467210a6SSenthilKumar Jegadeesan struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable, 127467210a6SSenthilKumar Jegadeesan u32 log_level); 128d7579d12SMichal Kazior struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter); 129d7579d12SMichal Kazior struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar); 130ffdd738dSRajkumar Manoharan struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar, 131ffdd738dSRajkumar Manoharan u32 period, u32 duration, 132ffdd738dSRajkumar Manoharan u32 next_offset, 133ffdd738dSRajkumar Manoharan u32 enabled); 134a57a6a27SRajkumar Manoharan struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar); 135dc8ab278SRajkumar Manoharan struct sk_buff *(*gen_addba_clear_resp)(struct ath10k *ar, u32 vdev_id, 136dc8ab278SRajkumar Manoharan const u8 *mac); 13765c0893dSRajkumar Manoharan struct sk_buff *(*gen_addba_send)(struct ath10k *ar, u32 vdev_id, 13865c0893dSRajkumar Manoharan const u8 *mac, u32 tid, u32 buf_size); 13911597413SRajkumar Manoharan struct sk_buff *(*gen_addba_set_resp)(struct ath10k *ar, u32 vdev_id, 14011597413SRajkumar Manoharan const u8 *mac, u32 tid, 14111597413SRajkumar Manoharan u32 status); 14250abef85SRajkumar Manoharan struct sk_buff *(*gen_delba_send)(struct ath10k *ar, u32 vdev_id, 14350abef85SRajkumar Manoharan const u8 *mac, u32 tid, u32 initiator, 14450abef85SRajkumar Manoharan u32 reason); 145be9ce9d8SMichal Kazior struct sk_buff *(*gen_bcn_tmpl)(struct ath10k *ar, u32 vdev_id, 146be9ce9d8SMichal Kazior u32 tim_ie_offset, struct sk_buff *bcn, 147be9ce9d8SMichal Kazior u32 prb_caps, u32 prb_erp, 148be9ce9d8SMichal Kazior void *prb_ies, size_t prb_ies_len); 1494c4955feSMichal Kazior struct sk_buff *(*gen_prb_tmpl)(struct ath10k *ar, u32 vdev_id, 1504c4955feSMichal Kazior struct sk_buff *bcn); 151369242b4SMichal Kazior struct sk_buff *(*gen_p2p_go_bcn_ie)(struct ath10k *ar, u32 vdev_id, 152369242b4SMichal Kazior const u8 *p2p_ie); 1530c7e477cSJanusz Dziedzic struct sk_buff *(*gen_vdev_sta_uapsd)(struct ath10k *ar, u32 vdev_id, 1540c7e477cSJanusz Dziedzic const u8 peer_addr[ETH_ALEN], 1550c7e477cSJanusz Dziedzic const struct wmi_sta_uapsd_auto_trig_arg *args, 1560c7e477cSJanusz Dziedzic u32 num_ac); 1576e8b188bSJanusz Dziedzic struct sk_buff *(*gen_sta_keepalive)(struct ath10k *ar, 1586e8b188bSJanusz Dziedzic const struct wmi_sta_keepalive_arg *arg); 159f5431e87SJanusz Dziedzic struct sk_buff *(*gen_wow_enable)(struct ath10k *ar); 160f5431e87SJanusz Dziedzic struct sk_buff *(*gen_wow_add_wakeup_event)(struct ath10k *ar, u32 vdev_id, 161f5431e87SJanusz Dziedzic enum wmi_wow_wakeup_event event, 162f5431e87SJanusz Dziedzic u32 enable); 163f5431e87SJanusz Dziedzic struct sk_buff *(*gen_wow_host_wakeup_ind)(struct ath10k *ar); 164d4976104SJanusz Dziedzic struct sk_buff *(*gen_wow_add_pattern)(struct ath10k *ar, u32 vdev_id, 165d4976104SJanusz Dziedzic u32 pattern_id, 166d4976104SJanusz Dziedzic const u8 *pattern, 167d4976104SJanusz Dziedzic const u8 *mask, 168d4976104SJanusz Dziedzic int pattern_len, 169d4976104SJanusz Dziedzic int pattern_offset); 170d4976104SJanusz Dziedzic struct sk_buff *(*gen_wow_del_pattern)(struct ath10k *ar, u32 vdev_id, 171d4976104SJanusz Dziedzic u32 pattern_id); 172ad45c888SMarek Puzyniak struct sk_buff *(*gen_update_fw_tdls_state)(struct ath10k *ar, 173ad45c888SMarek Puzyniak u32 vdev_id, 174ad45c888SMarek Puzyniak enum wmi_tdls_state state); 175ad45c888SMarek Puzyniak struct sk_buff *(*gen_tdls_peer_update)(struct ath10k *ar, 176ad45c888SMarek Puzyniak const struct wmi_tdls_peer_update_cmd_arg *arg, 177ad45c888SMarek Puzyniak const struct wmi_tdls_peer_capab_arg *cap, 178ad45c888SMarek Puzyniak const struct wmi_channel_arg *chan); 1795b272e30SMichal Kazior struct sk_buff *(*gen_adaptive_qcs)(struct ath10k *ar, bool enable); 180d7579d12SMichal Kazior }; 181d7579d12SMichal Kazior 182d7579d12SMichal Kazior int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id); 183d7579d12SMichal Kazior 184d7579d12SMichal Kazior static inline int 185d7579d12SMichal Kazior ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb) 186d7579d12SMichal Kazior { 187d7579d12SMichal Kazior if (WARN_ON_ONCE(!ar->wmi.ops->rx)) 188d7579d12SMichal Kazior return -EOPNOTSUPP; 189d7579d12SMichal Kazior 190d7579d12SMichal Kazior ar->wmi.ops->rx(ar, skb); 191d7579d12SMichal Kazior return 0; 192d7579d12SMichal Kazior } 193d7579d12SMichal Kazior 194d7579d12SMichal Kazior static inline int 195d7579d12SMichal Kazior ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out, 196d7579d12SMichal Kazior size_t len) 197d7579d12SMichal Kazior { 198d7579d12SMichal Kazior if (!ar->wmi.ops->map_svc) 199d7579d12SMichal Kazior return -EOPNOTSUPP; 200d7579d12SMichal Kazior 201d7579d12SMichal Kazior ar->wmi.ops->map_svc(in, out, len); 202d7579d12SMichal Kazior return 0; 203d7579d12SMichal Kazior } 204d7579d12SMichal Kazior 205d7579d12SMichal Kazior static inline int 206d7579d12SMichal Kazior ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb, 207d7579d12SMichal Kazior struct wmi_scan_ev_arg *arg) 208d7579d12SMichal Kazior { 209d7579d12SMichal Kazior if (!ar->wmi.ops->pull_scan) 210d7579d12SMichal Kazior return -EOPNOTSUPP; 211d7579d12SMichal Kazior 212d7579d12SMichal Kazior return ar->wmi.ops->pull_scan(ar, skb, arg); 213d7579d12SMichal Kazior } 214d7579d12SMichal Kazior 215d7579d12SMichal Kazior static inline int 216d7579d12SMichal Kazior ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb, 217d7579d12SMichal Kazior struct wmi_mgmt_rx_ev_arg *arg) 218d7579d12SMichal Kazior { 219d7579d12SMichal Kazior if (!ar->wmi.ops->pull_mgmt_rx) 220d7579d12SMichal Kazior return -EOPNOTSUPP; 221d7579d12SMichal Kazior 222d7579d12SMichal Kazior return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg); 223d7579d12SMichal Kazior } 224d7579d12SMichal Kazior 225d7579d12SMichal Kazior static inline int 226d7579d12SMichal Kazior ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb, 227d7579d12SMichal Kazior struct wmi_ch_info_ev_arg *arg) 228d7579d12SMichal Kazior { 229d7579d12SMichal Kazior if (!ar->wmi.ops->pull_ch_info) 230d7579d12SMichal Kazior return -EOPNOTSUPP; 231d7579d12SMichal Kazior 232d7579d12SMichal Kazior return ar->wmi.ops->pull_ch_info(ar, skb, arg); 233d7579d12SMichal Kazior } 234d7579d12SMichal Kazior 235d7579d12SMichal Kazior static inline int 236d7579d12SMichal Kazior ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb, 237d7579d12SMichal Kazior struct wmi_vdev_start_ev_arg *arg) 238d7579d12SMichal Kazior { 239d7579d12SMichal Kazior if (!ar->wmi.ops->pull_vdev_start) 240d7579d12SMichal Kazior return -EOPNOTSUPP; 241d7579d12SMichal Kazior 242d7579d12SMichal Kazior return ar->wmi.ops->pull_vdev_start(ar, skb, arg); 243d7579d12SMichal Kazior } 244d7579d12SMichal Kazior 245d7579d12SMichal Kazior static inline int 246d7579d12SMichal Kazior ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb, 247d7579d12SMichal Kazior struct wmi_peer_kick_ev_arg *arg) 248d7579d12SMichal Kazior { 249d7579d12SMichal Kazior if (!ar->wmi.ops->pull_peer_kick) 250d7579d12SMichal Kazior return -EOPNOTSUPP; 251d7579d12SMichal Kazior 252d7579d12SMichal Kazior return ar->wmi.ops->pull_peer_kick(ar, skb, arg); 253d7579d12SMichal Kazior } 254d7579d12SMichal Kazior 255d7579d12SMichal Kazior static inline int 256d7579d12SMichal Kazior ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb, 257d7579d12SMichal Kazior struct wmi_swba_ev_arg *arg) 258d7579d12SMichal Kazior { 259d7579d12SMichal Kazior if (!ar->wmi.ops->pull_swba) 260d7579d12SMichal Kazior return -EOPNOTSUPP; 261d7579d12SMichal Kazior 262d7579d12SMichal Kazior return ar->wmi.ops->pull_swba(ar, skb, arg); 263d7579d12SMichal Kazior } 264d7579d12SMichal Kazior 265d7579d12SMichal Kazior static inline int 266991adf71SRaja Mani ath10k_wmi_pull_phyerr_hdr(struct ath10k *ar, struct sk_buff *skb, 267991adf71SRaja Mani struct wmi_phyerr_hdr_arg *arg) 268991adf71SRaja Mani { 269991adf71SRaja Mani if (!ar->wmi.ops->pull_phyerr_hdr) 270991adf71SRaja Mani return -EOPNOTSUPP; 271991adf71SRaja Mani 272991adf71SRaja Mani return ar->wmi.ops->pull_phyerr_hdr(ar, skb, arg); 273991adf71SRaja Mani } 274991adf71SRaja Mani 275991adf71SRaja Mani static inline int 276991adf71SRaja Mani ath10k_wmi_pull_phyerr(struct ath10k *ar, const void *phyerr_buf, 277991adf71SRaja Mani int left_len, struct wmi_phyerr_ev_arg *arg) 278d7579d12SMichal Kazior { 279d7579d12SMichal Kazior if (!ar->wmi.ops->pull_phyerr) 280d7579d12SMichal Kazior return -EOPNOTSUPP; 281d7579d12SMichal Kazior 282991adf71SRaja Mani return ar->wmi.ops->pull_phyerr(ar, phyerr_buf, left_len, arg); 283d7579d12SMichal Kazior } 284d7579d12SMichal Kazior 285d7579d12SMichal Kazior static inline int 286d7579d12SMichal Kazior ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb, 287d7579d12SMichal Kazior struct wmi_svc_rdy_ev_arg *arg) 288d7579d12SMichal Kazior { 289d7579d12SMichal Kazior if (!ar->wmi.ops->pull_svc_rdy) 290d7579d12SMichal Kazior return -EOPNOTSUPP; 291d7579d12SMichal Kazior 292d7579d12SMichal Kazior return ar->wmi.ops->pull_svc_rdy(ar, skb, arg); 293d7579d12SMichal Kazior } 294d7579d12SMichal Kazior 295d7579d12SMichal Kazior static inline int 296d7579d12SMichal Kazior ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb, 297d7579d12SMichal Kazior struct wmi_rdy_ev_arg *arg) 298d7579d12SMichal Kazior { 299d7579d12SMichal Kazior if (!ar->wmi.ops->pull_rdy) 300d7579d12SMichal Kazior return -EOPNOTSUPP; 301d7579d12SMichal Kazior 302d7579d12SMichal Kazior return ar->wmi.ops->pull_rdy(ar, skb, arg); 303d7579d12SMichal Kazior } 304d7579d12SMichal Kazior 305d7579d12SMichal Kazior static inline int 306d7579d12SMichal Kazior ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb, 307d7579d12SMichal Kazior struct ath10k_fw_stats *stats) 308d7579d12SMichal Kazior { 309d7579d12SMichal Kazior if (!ar->wmi.ops->pull_fw_stats) 310d7579d12SMichal Kazior return -EOPNOTSUPP; 311d7579d12SMichal Kazior 312d7579d12SMichal Kazior return ar->wmi.ops->pull_fw_stats(ar, skb, stats); 313d7579d12SMichal Kazior } 314d7579d12SMichal Kazior 315d7579d12SMichal Kazior static inline int 316c1a4654aSMichal Kazior ath10k_wmi_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb, 317c1a4654aSMichal Kazior struct wmi_roam_ev_arg *arg) 318c1a4654aSMichal Kazior { 319c1a4654aSMichal Kazior if (!ar->wmi.ops->pull_roam_ev) 320c1a4654aSMichal Kazior return -EOPNOTSUPP; 321c1a4654aSMichal Kazior 322c1a4654aSMichal Kazior return ar->wmi.ops->pull_roam_ev(ar, skb, arg); 323c1a4654aSMichal Kazior } 324c1a4654aSMichal Kazior 325c1a4654aSMichal Kazior static inline int 326f5431e87SJanusz Dziedzic ath10k_wmi_pull_wow_event(struct ath10k *ar, struct sk_buff *skb, 327f5431e87SJanusz Dziedzic struct wmi_wow_ev_arg *arg) 328f5431e87SJanusz Dziedzic { 329f5431e87SJanusz Dziedzic if (!ar->wmi.ops->pull_wow_event) 330f5431e87SJanusz Dziedzic return -EOPNOTSUPP; 331f5431e87SJanusz Dziedzic 332f5431e87SJanusz Dziedzic return ar->wmi.ops->pull_wow_event(ar, skb, arg); 333f5431e87SJanusz Dziedzic } 334f5431e87SJanusz Dziedzic 33508e75ea8SVivek Natarajan static inline enum wmi_txbf_conf 33608e75ea8SVivek Natarajan ath10k_wmi_get_txbf_conf_scheme(struct ath10k *ar) 33708e75ea8SVivek Natarajan { 33808e75ea8SVivek Natarajan if (!ar->wmi.ops->get_txbf_conf_scheme) 33908e75ea8SVivek Natarajan return WMI_TXBF_CONF_UNSUPPORTED; 34008e75ea8SVivek Natarajan 34108e75ea8SVivek Natarajan return ar->wmi.ops->get_txbf_conf_scheme(ar); 34208e75ea8SVivek Natarajan } 34308e75ea8SVivek Natarajan 344f5431e87SJanusz Dziedzic static inline int 345d7579d12SMichal Kazior ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) 346d7579d12SMichal Kazior { 347d7579d12SMichal Kazior struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu); 348d7579d12SMichal Kazior struct sk_buff *skb; 349d7579d12SMichal Kazior int ret; 350d7579d12SMichal Kazior 351d7579d12SMichal Kazior if (!ar->wmi.ops->gen_mgmt_tx) 352d7579d12SMichal Kazior return -EOPNOTSUPP; 353d7579d12SMichal Kazior 354d7579d12SMichal Kazior skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu); 355d7579d12SMichal Kazior if (IS_ERR(skb)) 356d7579d12SMichal Kazior return PTR_ERR(skb); 357d7579d12SMichal Kazior 358d7579d12SMichal Kazior ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid); 359d7579d12SMichal Kazior if (ret) 360d7579d12SMichal Kazior return ret; 361d7579d12SMichal Kazior 362d7579d12SMichal Kazior /* FIXME There's no ACK event for Management Tx. This probably 363d7579d12SMichal Kazior * shouldn't be called here either. */ 364d7579d12SMichal Kazior info->flags |= IEEE80211_TX_STAT_ACK; 365d7579d12SMichal Kazior ieee80211_tx_status_irqsafe(ar->hw, msdu); 366d7579d12SMichal Kazior 367d7579d12SMichal Kazior return 0; 368d7579d12SMichal Kazior } 369d7579d12SMichal Kazior 370d7579d12SMichal Kazior static inline int 371d7579d12SMichal Kazior ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g, 372d7579d12SMichal Kazior u16 ctl2g, u16 ctl5g, 373d7579d12SMichal Kazior enum wmi_dfs_region dfs_reg) 374d7579d12SMichal Kazior { 375d7579d12SMichal Kazior struct sk_buff *skb; 376d7579d12SMichal Kazior 377d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_set_rd) 378d7579d12SMichal Kazior return -EOPNOTSUPP; 379d7579d12SMichal Kazior 380d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g, 381d7579d12SMichal Kazior dfs_reg); 382d7579d12SMichal Kazior if (IS_ERR(skb)) 383d7579d12SMichal Kazior return PTR_ERR(skb); 384d7579d12SMichal Kazior 385d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 386d7579d12SMichal Kazior ar->wmi.cmd->pdev_set_regdomain_cmdid); 387d7579d12SMichal Kazior } 388d7579d12SMichal Kazior 389d7579d12SMichal Kazior static inline int 390d7579d12SMichal Kazior ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt) 391d7579d12SMichal Kazior { 392d7579d12SMichal Kazior struct sk_buff *skb; 393d7579d12SMichal Kazior 394d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_suspend) 395d7579d12SMichal Kazior return -EOPNOTSUPP; 396d7579d12SMichal Kazior 397d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt); 398d7579d12SMichal Kazior if (IS_ERR(skb)) 399d7579d12SMichal Kazior return PTR_ERR(skb); 400d7579d12SMichal Kazior 401d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid); 402d7579d12SMichal Kazior } 403d7579d12SMichal Kazior 404d7579d12SMichal Kazior static inline int 405d7579d12SMichal Kazior ath10k_wmi_pdev_resume_target(struct ath10k *ar) 406d7579d12SMichal Kazior { 407d7579d12SMichal Kazior struct sk_buff *skb; 408d7579d12SMichal Kazior 409d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_resume) 410d7579d12SMichal Kazior return -EOPNOTSUPP; 411d7579d12SMichal Kazior 412d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_resume(ar); 413d7579d12SMichal Kazior if (IS_ERR(skb)) 414d7579d12SMichal Kazior return PTR_ERR(skb); 415d7579d12SMichal Kazior 416d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid); 417d7579d12SMichal Kazior } 418d7579d12SMichal Kazior 419d7579d12SMichal Kazior static inline int 420d7579d12SMichal Kazior ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value) 421d7579d12SMichal Kazior { 422d7579d12SMichal Kazior struct sk_buff *skb; 423d7579d12SMichal Kazior 424d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_set_param) 425d7579d12SMichal Kazior return -EOPNOTSUPP; 426d7579d12SMichal Kazior 427d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value); 428d7579d12SMichal Kazior if (IS_ERR(skb)) 429d7579d12SMichal Kazior return PTR_ERR(skb); 430d7579d12SMichal Kazior 431d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid); 432d7579d12SMichal Kazior } 433d7579d12SMichal Kazior 434d7579d12SMichal Kazior static inline int 435d7579d12SMichal Kazior ath10k_wmi_cmd_init(struct ath10k *ar) 436d7579d12SMichal Kazior { 437d7579d12SMichal Kazior struct sk_buff *skb; 438d7579d12SMichal Kazior 439d7579d12SMichal Kazior if (!ar->wmi.ops->gen_init) 440d7579d12SMichal Kazior return -EOPNOTSUPP; 441d7579d12SMichal Kazior 442d7579d12SMichal Kazior skb = ar->wmi.ops->gen_init(ar); 443d7579d12SMichal Kazior if (IS_ERR(skb)) 444d7579d12SMichal Kazior return PTR_ERR(skb); 445d7579d12SMichal Kazior 446d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid); 447d7579d12SMichal Kazior } 448d7579d12SMichal Kazior 449d7579d12SMichal Kazior static inline int 450d7579d12SMichal Kazior ath10k_wmi_start_scan(struct ath10k *ar, 451d7579d12SMichal Kazior const struct wmi_start_scan_arg *arg) 452d7579d12SMichal Kazior { 453d7579d12SMichal Kazior struct sk_buff *skb; 454d7579d12SMichal Kazior 455d7579d12SMichal Kazior if (!ar->wmi.ops->gen_start_scan) 456d7579d12SMichal Kazior return -EOPNOTSUPP; 457d7579d12SMichal Kazior 458d7579d12SMichal Kazior skb = ar->wmi.ops->gen_start_scan(ar, arg); 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->start_scan_cmdid); 463d7579d12SMichal Kazior } 464d7579d12SMichal Kazior 465d7579d12SMichal Kazior static inline int 466d7579d12SMichal Kazior ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg) 467d7579d12SMichal Kazior { 468d7579d12SMichal Kazior struct sk_buff *skb; 469d7579d12SMichal Kazior 470d7579d12SMichal Kazior if (!ar->wmi.ops->gen_stop_scan) 471d7579d12SMichal Kazior return -EOPNOTSUPP; 472d7579d12SMichal Kazior 473d7579d12SMichal Kazior skb = ar->wmi.ops->gen_stop_scan(ar, arg); 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->stop_scan_cmdid); 478d7579d12SMichal Kazior } 479d7579d12SMichal Kazior 480d7579d12SMichal Kazior static inline int 481d7579d12SMichal Kazior ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id, 482d7579d12SMichal Kazior enum wmi_vdev_type type, 483d7579d12SMichal Kazior enum wmi_vdev_subtype subtype, 484d7579d12SMichal Kazior const u8 macaddr[ETH_ALEN]) 485d7579d12SMichal Kazior { 486d7579d12SMichal Kazior struct sk_buff *skb; 487d7579d12SMichal Kazior 488d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_create) 489d7579d12SMichal Kazior return -EOPNOTSUPP; 490d7579d12SMichal Kazior 491d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr); 492d7579d12SMichal Kazior if (IS_ERR(skb)) 493d7579d12SMichal Kazior return PTR_ERR(skb); 494d7579d12SMichal Kazior 495d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid); 496d7579d12SMichal Kazior } 497d7579d12SMichal Kazior 498d7579d12SMichal Kazior static inline int 499d7579d12SMichal Kazior ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id) 500d7579d12SMichal Kazior { 501d7579d12SMichal Kazior struct sk_buff *skb; 502d7579d12SMichal Kazior 503d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_delete) 504d7579d12SMichal Kazior return -EOPNOTSUPP; 505d7579d12SMichal Kazior 506d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id); 507d7579d12SMichal Kazior if (IS_ERR(skb)) 508d7579d12SMichal Kazior return PTR_ERR(skb); 509d7579d12SMichal Kazior 510d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid); 511d7579d12SMichal Kazior } 512d7579d12SMichal Kazior 513d7579d12SMichal Kazior static inline int 514d7579d12SMichal Kazior ath10k_wmi_vdev_start(struct ath10k *ar, 515d7579d12SMichal Kazior const struct wmi_vdev_start_request_arg *arg) 516d7579d12SMichal Kazior { 517d7579d12SMichal Kazior struct sk_buff *skb; 518d7579d12SMichal Kazior 519d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_start) 520d7579d12SMichal Kazior return -EOPNOTSUPP; 521d7579d12SMichal Kazior 522d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_start(ar, arg, false); 523d7579d12SMichal Kazior if (IS_ERR(skb)) 524d7579d12SMichal Kazior return PTR_ERR(skb); 525d7579d12SMichal Kazior 526d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 527d7579d12SMichal Kazior ar->wmi.cmd->vdev_start_request_cmdid); 528d7579d12SMichal Kazior } 529d7579d12SMichal Kazior 530d7579d12SMichal Kazior static inline int 531d7579d12SMichal Kazior ath10k_wmi_vdev_restart(struct ath10k *ar, 532d7579d12SMichal Kazior const struct wmi_vdev_start_request_arg *arg) 533d7579d12SMichal Kazior { 534d7579d12SMichal Kazior struct sk_buff *skb; 535d7579d12SMichal Kazior 536d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_start) 537d7579d12SMichal Kazior return -EOPNOTSUPP; 538d7579d12SMichal Kazior 539d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_start(ar, arg, true); 540d7579d12SMichal Kazior if (IS_ERR(skb)) 541d7579d12SMichal Kazior return PTR_ERR(skb); 542d7579d12SMichal Kazior 543d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 544d7579d12SMichal Kazior ar->wmi.cmd->vdev_restart_request_cmdid); 545d7579d12SMichal Kazior } 546d7579d12SMichal Kazior 547d7579d12SMichal Kazior static inline int 548d7579d12SMichal Kazior ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id) 549d7579d12SMichal Kazior { 550d7579d12SMichal Kazior struct sk_buff *skb; 551d7579d12SMichal Kazior 552d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_stop) 553d7579d12SMichal Kazior return -EOPNOTSUPP; 554d7579d12SMichal Kazior 555d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id); 556d7579d12SMichal Kazior if (IS_ERR(skb)) 557d7579d12SMichal Kazior return PTR_ERR(skb); 558d7579d12SMichal Kazior 559d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid); 560d7579d12SMichal Kazior } 561d7579d12SMichal Kazior 562d7579d12SMichal Kazior static inline int 563d7579d12SMichal Kazior ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid) 564d7579d12SMichal Kazior { 565d7579d12SMichal Kazior struct sk_buff *skb; 566d7579d12SMichal Kazior 567d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_up) 568d7579d12SMichal Kazior return -EOPNOTSUPP; 569d7579d12SMichal Kazior 570d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid); 571d7579d12SMichal Kazior if (IS_ERR(skb)) 572d7579d12SMichal Kazior return PTR_ERR(skb); 573d7579d12SMichal Kazior 574d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid); 575d7579d12SMichal Kazior } 576d7579d12SMichal Kazior 577d7579d12SMichal Kazior static inline int 578d7579d12SMichal Kazior ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id) 579d7579d12SMichal Kazior { 580d7579d12SMichal Kazior struct sk_buff *skb; 581d7579d12SMichal Kazior 582d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_down) 583d7579d12SMichal Kazior return -EOPNOTSUPP; 584d7579d12SMichal Kazior 585d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id); 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->vdev_down_cmdid); 590d7579d12SMichal Kazior } 591d7579d12SMichal Kazior 592d7579d12SMichal Kazior static inline int 593d7579d12SMichal Kazior ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id, 594d7579d12SMichal Kazior u32 param_value) 595d7579d12SMichal Kazior { 596d7579d12SMichal Kazior struct sk_buff *skb; 597d7579d12SMichal Kazior 598d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_set_param) 599d7579d12SMichal Kazior return -EOPNOTSUPP; 600d7579d12SMichal Kazior 601d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id, 602d7579d12SMichal Kazior param_value); 603d7579d12SMichal Kazior if (IS_ERR(skb)) 604d7579d12SMichal Kazior return PTR_ERR(skb); 605d7579d12SMichal Kazior 606d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid); 607d7579d12SMichal Kazior } 608d7579d12SMichal Kazior 609d7579d12SMichal Kazior static inline int 610d7579d12SMichal Kazior ath10k_wmi_vdev_install_key(struct ath10k *ar, 611d7579d12SMichal Kazior const struct wmi_vdev_install_key_arg *arg) 612d7579d12SMichal Kazior { 613d7579d12SMichal Kazior struct sk_buff *skb; 614d7579d12SMichal Kazior 615d7579d12SMichal Kazior if (!ar->wmi.ops->gen_vdev_install_key) 616d7579d12SMichal Kazior return -EOPNOTSUPP; 617d7579d12SMichal Kazior 618d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_install_key(ar, arg); 619d7579d12SMichal Kazior if (IS_ERR(skb)) 620d7579d12SMichal Kazior return PTR_ERR(skb); 621d7579d12SMichal Kazior 622d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 623d7579d12SMichal Kazior ar->wmi.cmd->vdev_install_key_cmdid); 624d7579d12SMichal Kazior } 625d7579d12SMichal Kazior 626d7579d12SMichal Kazior static inline int 627d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_conf(struct ath10k *ar, 628d7579d12SMichal Kazior const struct wmi_vdev_spectral_conf_arg *arg) 629d7579d12SMichal Kazior { 630d7579d12SMichal Kazior struct sk_buff *skb; 631d7579d12SMichal Kazior u32 cmd_id; 632d7579d12SMichal Kazior 633d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg); 634d7579d12SMichal Kazior if (IS_ERR(skb)) 635d7579d12SMichal Kazior return PTR_ERR(skb); 636d7579d12SMichal Kazior 637d7579d12SMichal Kazior cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid; 638d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, cmd_id); 639d7579d12SMichal Kazior } 640d7579d12SMichal Kazior 641d7579d12SMichal Kazior static inline int 642d7579d12SMichal Kazior ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger, 643d7579d12SMichal Kazior u32 enable) 644d7579d12SMichal Kazior { 645d7579d12SMichal Kazior struct sk_buff *skb; 646d7579d12SMichal Kazior u32 cmd_id; 647d7579d12SMichal Kazior 648d7579d12SMichal Kazior skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger, 649d7579d12SMichal Kazior enable); 650d7579d12SMichal Kazior if (IS_ERR(skb)) 651d7579d12SMichal Kazior return PTR_ERR(skb); 652d7579d12SMichal Kazior 653d7579d12SMichal Kazior cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid; 654d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, cmd_id); 655d7579d12SMichal Kazior } 656d7579d12SMichal Kazior 657d7579d12SMichal Kazior static inline int 6580c7e477cSJanusz Dziedzic ath10k_wmi_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id, 6590c7e477cSJanusz Dziedzic const u8 peer_addr[ETH_ALEN], 6600c7e477cSJanusz Dziedzic const struct wmi_sta_uapsd_auto_trig_arg *args, 6610c7e477cSJanusz Dziedzic u32 num_ac) 6620c7e477cSJanusz Dziedzic { 6630c7e477cSJanusz Dziedzic struct sk_buff *skb; 6640c7e477cSJanusz Dziedzic u32 cmd_id; 6650c7e477cSJanusz Dziedzic 6660c7e477cSJanusz Dziedzic if (!ar->wmi.ops->gen_vdev_sta_uapsd) 6670c7e477cSJanusz Dziedzic return -EOPNOTSUPP; 6680c7e477cSJanusz Dziedzic 6690c7e477cSJanusz Dziedzic skb = ar->wmi.ops->gen_vdev_sta_uapsd(ar, vdev_id, peer_addr, args, 6700c7e477cSJanusz Dziedzic num_ac); 6710c7e477cSJanusz Dziedzic if (IS_ERR(skb)) 6720c7e477cSJanusz Dziedzic return PTR_ERR(skb); 6730c7e477cSJanusz Dziedzic 6740c7e477cSJanusz Dziedzic cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid; 6750c7e477cSJanusz Dziedzic return ath10k_wmi_cmd_send(ar, skb, cmd_id); 6760c7e477cSJanusz Dziedzic } 6770c7e477cSJanusz Dziedzic 6780c7e477cSJanusz Dziedzic static inline int 6796d492fe2SMichal Kazior ath10k_wmi_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id, 6806d492fe2SMichal Kazior const struct wmi_wmm_params_all_arg *arg) 6816d492fe2SMichal Kazior { 6826d492fe2SMichal Kazior struct sk_buff *skb; 6836d492fe2SMichal Kazior u32 cmd_id; 6846d492fe2SMichal Kazior 6856d492fe2SMichal Kazior skb = ar->wmi.ops->gen_vdev_wmm_conf(ar, vdev_id, arg); 6866d492fe2SMichal Kazior if (IS_ERR(skb)) 6876d492fe2SMichal Kazior return PTR_ERR(skb); 6886d492fe2SMichal Kazior 6896d492fe2SMichal Kazior cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid; 6906d492fe2SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, cmd_id); 6916d492fe2SMichal Kazior } 6926d492fe2SMichal Kazior 6936d492fe2SMichal Kazior static inline int 694d7579d12SMichal Kazior ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id, 6957390ed34SMarek Puzyniak const u8 peer_addr[ETH_ALEN], 6967390ed34SMarek Puzyniak enum wmi_peer_type peer_type) 697d7579d12SMichal Kazior { 698d7579d12SMichal Kazior struct sk_buff *skb; 699d7579d12SMichal Kazior 700d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_create) 701d7579d12SMichal Kazior return -EOPNOTSUPP; 702d7579d12SMichal Kazior 7037390ed34SMarek Puzyniak skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr, peer_type); 704d7579d12SMichal Kazior if (IS_ERR(skb)) 705d7579d12SMichal Kazior return PTR_ERR(skb); 706d7579d12SMichal Kazior 707d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid); 708d7579d12SMichal Kazior } 709d7579d12SMichal Kazior 710d7579d12SMichal Kazior static inline int 711d7579d12SMichal Kazior ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id, 712d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN]) 713d7579d12SMichal Kazior { 714d7579d12SMichal Kazior struct sk_buff *skb; 715d7579d12SMichal Kazior 716d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_delete) 717d7579d12SMichal Kazior return -EOPNOTSUPP; 718d7579d12SMichal Kazior 719d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr); 720d7579d12SMichal Kazior if (IS_ERR(skb)) 721d7579d12SMichal Kazior return PTR_ERR(skb); 722d7579d12SMichal Kazior 723d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid); 724d7579d12SMichal Kazior } 725d7579d12SMichal Kazior 726d7579d12SMichal Kazior static inline int 727d7579d12SMichal Kazior ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id, 728d7579d12SMichal Kazior const u8 peer_addr[ETH_ALEN], u32 tid_bitmap) 729d7579d12SMichal Kazior { 730d7579d12SMichal Kazior struct sk_buff *skb; 731d7579d12SMichal Kazior 732d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_flush) 733d7579d12SMichal Kazior return -EOPNOTSUPP; 734d7579d12SMichal Kazior 735d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap); 736d7579d12SMichal Kazior if (IS_ERR(skb)) 737d7579d12SMichal Kazior return PTR_ERR(skb); 738d7579d12SMichal Kazior 739d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid); 740d7579d12SMichal Kazior } 741d7579d12SMichal Kazior 742d7579d12SMichal Kazior static inline int 743d7579d12SMichal Kazior ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr, 744d7579d12SMichal Kazior enum wmi_peer_param param_id, u32 param_value) 745d7579d12SMichal Kazior { 746d7579d12SMichal Kazior struct sk_buff *skb; 747d7579d12SMichal Kazior 748d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_set_param) 749d7579d12SMichal Kazior return -EOPNOTSUPP; 750d7579d12SMichal Kazior 751d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id, 752d7579d12SMichal Kazior param_value); 753d7579d12SMichal Kazior if (IS_ERR(skb)) 754d7579d12SMichal Kazior return PTR_ERR(skb); 755d7579d12SMichal Kazior 756d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid); 757d7579d12SMichal Kazior } 758d7579d12SMichal Kazior 759d7579d12SMichal Kazior static inline int 760d7579d12SMichal Kazior ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id, 761d7579d12SMichal Kazior enum wmi_sta_ps_mode psmode) 762d7579d12SMichal Kazior { 763d7579d12SMichal Kazior struct sk_buff *skb; 764d7579d12SMichal Kazior 765d7579d12SMichal Kazior if (!ar->wmi.ops->gen_set_psmode) 766d7579d12SMichal Kazior return -EOPNOTSUPP; 767d7579d12SMichal Kazior 768d7579d12SMichal Kazior skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode); 769d7579d12SMichal Kazior if (IS_ERR(skb)) 770d7579d12SMichal Kazior return PTR_ERR(skb); 771d7579d12SMichal Kazior 772d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 773d7579d12SMichal Kazior ar->wmi.cmd->sta_powersave_mode_cmdid); 774d7579d12SMichal Kazior } 775d7579d12SMichal Kazior 776d7579d12SMichal Kazior static inline int 777d7579d12SMichal Kazior ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id, 778d7579d12SMichal Kazior enum wmi_sta_powersave_param param_id, u32 value) 779d7579d12SMichal Kazior { 780d7579d12SMichal Kazior struct sk_buff *skb; 781d7579d12SMichal Kazior 782d7579d12SMichal Kazior if (!ar->wmi.ops->gen_set_sta_ps) 783d7579d12SMichal Kazior return -EOPNOTSUPP; 784d7579d12SMichal Kazior 785d7579d12SMichal Kazior skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value); 786d7579d12SMichal Kazior if (IS_ERR(skb)) 787d7579d12SMichal Kazior return PTR_ERR(skb); 788d7579d12SMichal Kazior 789d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 790d7579d12SMichal Kazior ar->wmi.cmd->sta_powersave_param_cmdid); 791d7579d12SMichal Kazior } 792d7579d12SMichal Kazior 793d7579d12SMichal Kazior static inline int 794d7579d12SMichal Kazior ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac, 795d7579d12SMichal Kazior enum wmi_ap_ps_peer_param param_id, u32 value) 796d7579d12SMichal Kazior { 797d7579d12SMichal Kazior struct sk_buff *skb; 798d7579d12SMichal Kazior 799d7579d12SMichal Kazior if (!ar->wmi.ops->gen_set_ap_ps) 800d7579d12SMichal Kazior return -EOPNOTSUPP; 801d7579d12SMichal Kazior 802d7579d12SMichal Kazior skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value); 803d7579d12SMichal Kazior if (IS_ERR(skb)) 804d7579d12SMichal Kazior return PTR_ERR(skb); 805d7579d12SMichal Kazior 806d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 807d7579d12SMichal Kazior ar->wmi.cmd->ap_ps_peer_param_cmdid); 808d7579d12SMichal Kazior } 809d7579d12SMichal Kazior 810d7579d12SMichal Kazior static inline int 811d7579d12SMichal Kazior ath10k_wmi_scan_chan_list(struct ath10k *ar, 812d7579d12SMichal Kazior const struct wmi_scan_chan_list_arg *arg) 813d7579d12SMichal Kazior { 814d7579d12SMichal Kazior struct sk_buff *skb; 815d7579d12SMichal Kazior 816d7579d12SMichal Kazior if (!ar->wmi.ops->gen_scan_chan_list) 817d7579d12SMichal Kazior return -EOPNOTSUPP; 818d7579d12SMichal Kazior 819d7579d12SMichal Kazior skb = ar->wmi.ops->gen_scan_chan_list(ar, arg); 820d7579d12SMichal Kazior if (IS_ERR(skb)) 821d7579d12SMichal Kazior return PTR_ERR(skb); 822d7579d12SMichal Kazior 823d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid); 824d7579d12SMichal Kazior } 825d7579d12SMichal Kazior 826d7579d12SMichal Kazior static inline int 827d7579d12SMichal Kazior ath10k_wmi_peer_assoc(struct ath10k *ar, 828d7579d12SMichal Kazior const struct wmi_peer_assoc_complete_arg *arg) 829d7579d12SMichal Kazior { 830d7579d12SMichal Kazior struct sk_buff *skb; 831d7579d12SMichal Kazior 832d7579d12SMichal Kazior if (!ar->wmi.ops->gen_peer_assoc) 833d7579d12SMichal Kazior return -EOPNOTSUPP; 834d7579d12SMichal Kazior 835d7579d12SMichal Kazior skb = ar->wmi.ops->gen_peer_assoc(ar, arg); 836d7579d12SMichal Kazior if (IS_ERR(skb)) 837d7579d12SMichal Kazior return PTR_ERR(skb); 838d7579d12SMichal Kazior 839d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid); 840d7579d12SMichal Kazior } 841d7579d12SMichal Kazior 842d7579d12SMichal Kazior static inline int 8439ad50182SMichal Kazior ath10k_wmi_beacon_send_ref_nowait(struct ath10k *ar, u32 vdev_id, 8449ad50182SMichal Kazior const void *bcn, size_t bcn_len, 8459ad50182SMichal Kazior u32 bcn_paddr, bool dtim_zero, 8469ad50182SMichal Kazior bool deliver_cab) 847d7579d12SMichal Kazior { 848d7579d12SMichal Kazior struct sk_buff *skb; 849d7579d12SMichal Kazior int ret; 850d7579d12SMichal Kazior 851d7579d12SMichal Kazior if (!ar->wmi.ops->gen_beacon_dma) 852d7579d12SMichal Kazior return -EOPNOTSUPP; 853d7579d12SMichal Kazior 8549ad50182SMichal Kazior skb = ar->wmi.ops->gen_beacon_dma(ar, vdev_id, bcn, bcn_len, bcn_paddr, 8559ad50182SMichal Kazior dtim_zero, deliver_cab); 856d7579d12SMichal Kazior if (IS_ERR(skb)) 857d7579d12SMichal Kazior return PTR_ERR(skb); 858d7579d12SMichal Kazior 859d7579d12SMichal Kazior ret = ath10k_wmi_cmd_send_nowait(ar, skb, 860d7579d12SMichal Kazior ar->wmi.cmd->pdev_send_bcn_cmdid); 861d7579d12SMichal Kazior if (ret) { 862d7579d12SMichal Kazior dev_kfree_skb(skb); 863d7579d12SMichal Kazior return ret; 864d7579d12SMichal Kazior } 865d7579d12SMichal Kazior 866d7579d12SMichal Kazior return 0; 867d7579d12SMichal Kazior } 868d7579d12SMichal Kazior 869d7579d12SMichal Kazior static inline int 870d7579d12SMichal Kazior ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar, 8715e752e42SMichal Kazior const struct wmi_wmm_params_all_arg *arg) 872d7579d12SMichal Kazior { 873d7579d12SMichal Kazior struct sk_buff *skb; 874d7579d12SMichal Kazior 875d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pdev_set_wmm) 876d7579d12SMichal Kazior return -EOPNOTSUPP; 877d7579d12SMichal Kazior 878d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg); 879d7579d12SMichal Kazior if (IS_ERR(skb)) 880d7579d12SMichal Kazior return PTR_ERR(skb); 881d7579d12SMichal Kazior 882d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 883d7579d12SMichal Kazior ar->wmi.cmd->pdev_set_wmm_params_cmdid); 884d7579d12SMichal Kazior } 885d7579d12SMichal Kazior 886d7579d12SMichal Kazior static inline int 887de23d3efSMichal Kazior ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask) 888d7579d12SMichal Kazior { 889d7579d12SMichal Kazior struct sk_buff *skb; 890d7579d12SMichal Kazior 891d7579d12SMichal Kazior if (!ar->wmi.ops->gen_request_stats) 892d7579d12SMichal Kazior return -EOPNOTSUPP; 893d7579d12SMichal Kazior 894de23d3efSMichal Kazior skb = ar->wmi.ops->gen_request_stats(ar, stats_mask); 895d7579d12SMichal Kazior if (IS_ERR(skb)) 896d7579d12SMichal Kazior return PTR_ERR(skb); 897d7579d12SMichal Kazior 898d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid); 899d7579d12SMichal Kazior } 900d7579d12SMichal Kazior 901d7579d12SMichal Kazior static inline int 902d7579d12SMichal Kazior ath10k_wmi_force_fw_hang(struct ath10k *ar, 903d7579d12SMichal Kazior enum wmi_force_fw_hang_type type, u32 delay_ms) 904d7579d12SMichal Kazior { 905d7579d12SMichal Kazior struct sk_buff *skb; 906d7579d12SMichal Kazior 907d7579d12SMichal Kazior if (!ar->wmi.ops->gen_force_fw_hang) 908d7579d12SMichal Kazior return -EOPNOTSUPP; 909d7579d12SMichal Kazior 910d7579d12SMichal Kazior skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms); 911d7579d12SMichal Kazior if (IS_ERR(skb)) 912d7579d12SMichal Kazior return PTR_ERR(skb); 913d7579d12SMichal Kazior 914d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid); 915d7579d12SMichal Kazior } 916d7579d12SMichal Kazior 917d7579d12SMichal Kazior static inline int 918467210a6SSenthilKumar Jegadeesan ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable, u32 log_level) 919d7579d12SMichal Kazior { 920d7579d12SMichal Kazior struct sk_buff *skb; 921d7579d12SMichal Kazior 922d7579d12SMichal Kazior if (!ar->wmi.ops->gen_dbglog_cfg) 923d7579d12SMichal Kazior return -EOPNOTSUPP; 924d7579d12SMichal Kazior 925467210a6SSenthilKumar Jegadeesan skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level); 926d7579d12SMichal Kazior if (IS_ERR(skb)) 927d7579d12SMichal Kazior return PTR_ERR(skb); 928d7579d12SMichal Kazior 929d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid); 930d7579d12SMichal Kazior } 931d7579d12SMichal Kazior 932d7579d12SMichal Kazior static inline int 933d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter) 934d7579d12SMichal Kazior { 935d7579d12SMichal Kazior struct sk_buff *skb; 936d7579d12SMichal Kazior 937d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pktlog_enable) 938d7579d12SMichal Kazior return -EOPNOTSUPP; 939d7579d12SMichal Kazior 940d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pktlog_enable(ar, filter); 941d7579d12SMichal Kazior if (IS_ERR(skb)) 942d7579d12SMichal Kazior return PTR_ERR(skb); 943d7579d12SMichal Kazior 944d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid); 945d7579d12SMichal Kazior } 946d7579d12SMichal Kazior 947d7579d12SMichal Kazior static inline int 948d7579d12SMichal Kazior ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar) 949d7579d12SMichal Kazior { 950d7579d12SMichal Kazior struct sk_buff *skb; 951d7579d12SMichal Kazior 952d7579d12SMichal Kazior if (!ar->wmi.ops->gen_pktlog_disable) 953d7579d12SMichal Kazior return -EOPNOTSUPP; 954d7579d12SMichal Kazior 955d7579d12SMichal Kazior skb = ar->wmi.ops->gen_pktlog_disable(ar); 956d7579d12SMichal Kazior if (IS_ERR(skb)) 957d7579d12SMichal Kazior return PTR_ERR(skb); 958d7579d12SMichal Kazior 959d7579d12SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, 960d7579d12SMichal Kazior ar->wmi.cmd->pdev_pktlog_disable_cmdid); 961d7579d12SMichal Kazior } 962d7579d12SMichal Kazior 963ffdd738dSRajkumar Manoharan static inline int 964ffdd738dSRajkumar Manoharan ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration, 965ffdd738dSRajkumar Manoharan u32 next_offset, u32 enabled) 966ffdd738dSRajkumar Manoharan { 967ffdd738dSRajkumar Manoharan struct sk_buff *skb; 968ffdd738dSRajkumar Manoharan 969ffdd738dSRajkumar Manoharan if (!ar->wmi.ops->gen_pdev_set_quiet_mode) 970ffdd738dSRajkumar Manoharan return -EOPNOTSUPP; 971ffdd738dSRajkumar Manoharan 972ffdd738dSRajkumar Manoharan skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration, 973ffdd738dSRajkumar Manoharan next_offset, enabled); 974ffdd738dSRajkumar Manoharan if (IS_ERR(skb)) 975ffdd738dSRajkumar Manoharan return PTR_ERR(skb); 976ffdd738dSRajkumar Manoharan 977ffdd738dSRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 978ffdd738dSRajkumar Manoharan ar->wmi.cmd->pdev_set_quiet_mode_cmdid); 979ffdd738dSRajkumar Manoharan } 980ffdd738dSRajkumar Manoharan 981a57a6a27SRajkumar Manoharan static inline int 982a57a6a27SRajkumar Manoharan ath10k_wmi_pdev_get_temperature(struct ath10k *ar) 983a57a6a27SRajkumar Manoharan { 984a57a6a27SRajkumar Manoharan struct sk_buff *skb; 985a57a6a27SRajkumar Manoharan 986a57a6a27SRajkumar Manoharan if (!ar->wmi.ops->gen_pdev_get_temperature) 987a57a6a27SRajkumar Manoharan return -EOPNOTSUPP; 988a57a6a27SRajkumar Manoharan 989a57a6a27SRajkumar Manoharan skb = ar->wmi.ops->gen_pdev_get_temperature(ar); 990a57a6a27SRajkumar Manoharan if (IS_ERR(skb)) 991a57a6a27SRajkumar Manoharan return PTR_ERR(skb); 992a57a6a27SRajkumar Manoharan 993a57a6a27SRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 994a57a6a27SRajkumar Manoharan ar->wmi.cmd->pdev_get_temperature_cmdid); 995a57a6a27SRajkumar Manoharan } 996a57a6a27SRajkumar Manoharan 997dc8ab278SRajkumar Manoharan static inline int 998dc8ab278SRajkumar Manoharan ath10k_wmi_addba_clear_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac) 999dc8ab278SRajkumar Manoharan { 1000dc8ab278SRajkumar Manoharan struct sk_buff *skb; 1001dc8ab278SRajkumar Manoharan 1002dc8ab278SRajkumar Manoharan if (!ar->wmi.ops->gen_addba_clear_resp) 1003dc8ab278SRajkumar Manoharan return -EOPNOTSUPP; 1004dc8ab278SRajkumar Manoharan 1005dc8ab278SRajkumar Manoharan skb = ar->wmi.ops->gen_addba_clear_resp(ar, vdev_id, mac); 1006dc8ab278SRajkumar Manoharan if (IS_ERR(skb)) 1007dc8ab278SRajkumar Manoharan return PTR_ERR(skb); 1008dc8ab278SRajkumar Manoharan 1009dc8ab278SRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 1010dc8ab278SRajkumar Manoharan ar->wmi.cmd->addba_clear_resp_cmdid); 1011dc8ab278SRajkumar Manoharan } 1012dc8ab278SRajkumar Manoharan 101365c0893dSRajkumar Manoharan static inline int 101465c0893dSRajkumar Manoharan ath10k_wmi_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 101565c0893dSRajkumar Manoharan u32 tid, u32 buf_size) 101665c0893dSRajkumar Manoharan { 101765c0893dSRajkumar Manoharan struct sk_buff *skb; 101865c0893dSRajkumar Manoharan 101965c0893dSRajkumar Manoharan if (!ar->wmi.ops->gen_addba_send) 102065c0893dSRajkumar Manoharan return -EOPNOTSUPP; 102165c0893dSRajkumar Manoharan 102265c0893dSRajkumar Manoharan skb = ar->wmi.ops->gen_addba_send(ar, vdev_id, mac, tid, buf_size); 102365c0893dSRajkumar Manoharan if (IS_ERR(skb)) 102465c0893dSRajkumar Manoharan return PTR_ERR(skb); 102565c0893dSRajkumar Manoharan 102665c0893dSRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 102765c0893dSRajkumar Manoharan ar->wmi.cmd->addba_send_cmdid); 102865c0893dSRajkumar Manoharan } 102965c0893dSRajkumar Manoharan 103011597413SRajkumar Manoharan static inline int 103111597413SRajkumar Manoharan ath10k_wmi_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac, 103211597413SRajkumar Manoharan u32 tid, u32 status) 103311597413SRajkumar Manoharan { 103411597413SRajkumar Manoharan struct sk_buff *skb; 103511597413SRajkumar Manoharan 103611597413SRajkumar Manoharan if (!ar->wmi.ops->gen_addba_set_resp) 103711597413SRajkumar Manoharan return -EOPNOTSUPP; 103811597413SRajkumar Manoharan 103911597413SRajkumar Manoharan skb = ar->wmi.ops->gen_addba_set_resp(ar, vdev_id, mac, tid, status); 104011597413SRajkumar Manoharan if (IS_ERR(skb)) 104111597413SRajkumar Manoharan return PTR_ERR(skb); 104211597413SRajkumar Manoharan 104311597413SRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 104411597413SRajkumar Manoharan ar->wmi.cmd->addba_set_resp_cmdid); 104511597413SRajkumar Manoharan } 104611597413SRajkumar Manoharan 104750abef85SRajkumar Manoharan static inline int 104850abef85SRajkumar Manoharan ath10k_wmi_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 104950abef85SRajkumar Manoharan u32 tid, u32 initiator, u32 reason) 105050abef85SRajkumar Manoharan { 105150abef85SRajkumar Manoharan struct sk_buff *skb; 105250abef85SRajkumar Manoharan 105350abef85SRajkumar Manoharan if (!ar->wmi.ops->gen_delba_send) 105450abef85SRajkumar Manoharan return -EOPNOTSUPP; 105550abef85SRajkumar Manoharan 105650abef85SRajkumar Manoharan skb = ar->wmi.ops->gen_delba_send(ar, vdev_id, mac, tid, initiator, 105750abef85SRajkumar Manoharan reason); 105850abef85SRajkumar Manoharan if (IS_ERR(skb)) 105950abef85SRajkumar Manoharan return PTR_ERR(skb); 106050abef85SRajkumar Manoharan 106150abef85SRajkumar Manoharan return ath10k_wmi_cmd_send(ar, skb, 106250abef85SRajkumar Manoharan ar->wmi.cmd->delba_send_cmdid); 106350abef85SRajkumar Manoharan } 106450abef85SRajkumar Manoharan 1065be9ce9d8SMichal Kazior static inline int 1066be9ce9d8SMichal Kazior ath10k_wmi_bcn_tmpl(struct ath10k *ar, u32 vdev_id, u32 tim_ie_offset, 1067be9ce9d8SMichal Kazior struct sk_buff *bcn, u32 prb_caps, u32 prb_erp, 1068be9ce9d8SMichal Kazior void *prb_ies, size_t prb_ies_len) 1069be9ce9d8SMichal Kazior { 1070be9ce9d8SMichal Kazior struct sk_buff *skb; 1071be9ce9d8SMichal Kazior 1072be9ce9d8SMichal Kazior if (!ar->wmi.ops->gen_bcn_tmpl) 1073be9ce9d8SMichal Kazior return -EOPNOTSUPP; 1074be9ce9d8SMichal Kazior 1075be9ce9d8SMichal Kazior skb = ar->wmi.ops->gen_bcn_tmpl(ar, vdev_id, tim_ie_offset, bcn, 1076be9ce9d8SMichal Kazior prb_caps, prb_erp, prb_ies, 1077be9ce9d8SMichal Kazior prb_ies_len); 1078be9ce9d8SMichal Kazior if (IS_ERR(skb)) 1079be9ce9d8SMichal Kazior return PTR_ERR(skb); 1080be9ce9d8SMichal Kazior 1081be9ce9d8SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->bcn_tmpl_cmdid); 1082be9ce9d8SMichal Kazior } 1083be9ce9d8SMichal Kazior 10844c4955feSMichal Kazior static inline int 10854c4955feSMichal Kazior ath10k_wmi_prb_tmpl(struct ath10k *ar, u32 vdev_id, struct sk_buff *prb) 10864c4955feSMichal Kazior { 10874c4955feSMichal Kazior struct sk_buff *skb; 10884c4955feSMichal Kazior 10894c4955feSMichal Kazior if (!ar->wmi.ops->gen_prb_tmpl) 10904c4955feSMichal Kazior return -EOPNOTSUPP; 10914c4955feSMichal Kazior 10924c4955feSMichal Kazior skb = ar->wmi.ops->gen_prb_tmpl(ar, vdev_id, prb); 10934c4955feSMichal Kazior if (IS_ERR(skb)) 10944c4955feSMichal Kazior return PTR_ERR(skb); 10954c4955feSMichal Kazior 10964c4955feSMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->prb_tmpl_cmdid); 10974c4955feSMichal Kazior } 10984c4955feSMichal Kazior 1099369242b4SMichal Kazior static inline int 1100369242b4SMichal Kazior ath10k_wmi_p2p_go_bcn_ie(struct ath10k *ar, u32 vdev_id, const u8 *p2p_ie) 1101369242b4SMichal Kazior { 1102369242b4SMichal Kazior struct sk_buff *skb; 1103369242b4SMichal Kazior 1104369242b4SMichal Kazior if (!ar->wmi.ops->gen_p2p_go_bcn_ie) 1105369242b4SMichal Kazior return -EOPNOTSUPP; 1106369242b4SMichal Kazior 1107369242b4SMichal Kazior skb = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, vdev_id, p2p_ie); 1108369242b4SMichal Kazior if (IS_ERR(skb)) 1109369242b4SMichal Kazior return PTR_ERR(skb); 1110369242b4SMichal Kazior 1111369242b4SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->p2p_go_set_beacon_ie); 1112369242b4SMichal Kazior } 1113369242b4SMichal Kazior 11146e8b188bSJanusz Dziedzic static inline int 11156e8b188bSJanusz Dziedzic ath10k_wmi_sta_keepalive(struct ath10k *ar, 11166e8b188bSJanusz Dziedzic const struct wmi_sta_keepalive_arg *arg) 11176e8b188bSJanusz Dziedzic { 11186e8b188bSJanusz Dziedzic struct sk_buff *skb; 11196e8b188bSJanusz Dziedzic u32 cmd_id; 11206e8b188bSJanusz Dziedzic 11216e8b188bSJanusz Dziedzic if (!ar->wmi.ops->gen_sta_keepalive) 11226e8b188bSJanusz Dziedzic return -EOPNOTSUPP; 11236e8b188bSJanusz Dziedzic 11246e8b188bSJanusz Dziedzic skb = ar->wmi.ops->gen_sta_keepalive(ar, arg); 11256e8b188bSJanusz Dziedzic if (IS_ERR(skb)) 11266e8b188bSJanusz Dziedzic return PTR_ERR(skb); 11276e8b188bSJanusz Dziedzic 11286e8b188bSJanusz Dziedzic cmd_id = ar->wmi.cmd->sta_keepalive_cmd; 11296e8b188bSJanusz Dziedzic return ath10k_wmi_cmd_send(ar, skb, cmd_id); 11306e8b188bSJanusz Dziedzic } 11316e8b188bSJanusz Dziedzic 1132f5431e87SJanusz Dziedzic static inline int 1133f5431e87SJanusz Dziedzic ath10k_wmi_wow_enable(struct ath10k *ar) 1134f5431e87SJanusz Dziedzic { 1135f5431e87SJanusz Dziedzic struct sk_buff *skb; 1136f5431e87SJanusz Dziedzic u32 cmd_id; 1137f5431e87SJanusz Dziedzic 1138f5431e87SJanusz Dziedzic if (!ar->wmi.ops->gen_wow_enable) 1139f5431e87SJanusz Dziedzic return -EOPNOTSUPP; 1140f5431e87SJanusz Dziedzic 1141f5431e87SJanusz Dziedzic skb = ar->wmi.ops->gen_wow_enable(ar); 1142f5431e87SJanusz Dziedzic if (IS_ERR(skb)) 1143f5431e87SJanusz Dziedzic return PTR_ERR(skb); 1144f5431e87SJanusz Dziedzic 1145f5431e87SJanusz Dziedzic cmd_id = ar->wmi.cmd->wow_enable_cmdid; 1146f5431e87SJanusz Dziedzic return ath10k_wmi_cmd_send(ar, skb, cmd_id); 1147f5431e87SJanusz Dziedzic } 1148f5431e87SJanusz Dziedzic 1149f5431e87SJanusz Dziedzic static inline int 1150f5431e87SJanusz Dziedzic ath10k_wmi_wow_add_wakeup_event(struct ath10k *ar, u32 vdev_id, 1151f5431e87SJanusz Dziedzic enum wmi_wow_wakeup_event event, 1152f5431e87SJanusz Dziedzic u32 enable) 1153f5431e87SJanusz Dziedzic { 1154f5431e87SJanusz Dziedzic struct sk_buff *skb; 1155f5431e87SJanusz Dziedzic u32 cmd_id; 1156f5431e87SJanusz Dziedzic 1157f5431e87SJanusz Dziedzic if (!ar->wmi.ops->gen_wow_add_wakeup_event) 1158f5431e87SJanusz Dziedzic return -EOPNOTSUPP; 1159f5431e87SJanusz Dziedzic 1160f5431e87SJanusz Dziedzic skb = ar->wmi.ops->gen_wow_add_wakeup_event(ar, vdev_id, event, enable); 1161f5431e87SJanusz Dziedzic if (IS_ERR(skb)) 1162f5431e87SJanusz Dziedzic return PTR_ERR(skb); 1163f5431e87SJanusz Dziedzic 1164f5431e87SJanusz Dziedzic cmd_id = ar->wmi.cmd->wow_enable_disable_wake_event_cmdid; 1165f5431e87SJanusz Dziedzic return ath10k_wmi_cmd_send(ar, skb, cmd_id); 1166f5431e87SJanusz Dziedzic } 1167f5431e87SJanusz Dziedzic 1168f5431e87SJanusz Dziedzic static inline int 1169f5431e87SJanusz Dziedzic ath10k_wmi_wow_host_wakeup_ind(struct ath10k *ar) 1170f5431e87SJanusz Dziedzic { 1171f5431e87SJanusz Dziedzic struct sk_buff *skb; 1172f5431e87SJanusz Dziedzic u32 cmd_id; 1173f5431e87SJanusz Dziedzic 1174f5431e87SJanusz Dziedzic if (!ar->wmi.ops->gen_wow_host_wakeup_ind) 1175f5431e87SJanusz Dziedzic return -EOPNOTSUPP; 1176f5431e87SJanusz Dziedzic 1177f5431e87SJanusz Dziedzic skb = ar->wmi.ops->gen_wow_host_wakeup_ind(ar); 1178f5431e87SJanusz Dziedzic if (IS_ERR(skb)) 1179f5431e87SJanusz Dziedzic return PTR_ERR(skb); 1180f5431e87SJanusz Dziedzic 1181f5431e87SJanusz Dziedzic cmd_id = ar->wmi.cmd->wow_hostwakeup_from_sleep_cmdid; 1182f5431e87SJanusz Dziedzic return ath10k_wmi_cmd_send(ar, skb, cmd_id); 1183f5431e87SJanusz Dziedzic } 1184f5431e87SJanusz Dziedzic 1185d4976104SJanusz Dziedzic static inline int 1186d4976104SJanusz Dziedzic ath10k_wmi_wow_add_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id, 1187d4976104SJanusz Dziedzic const u8 *pattern, const u8 *mask, 1188d4976104SJanusz Dziedzic int pattern_len, int pattern_offset) 1189d4976104SJanusz Dziedzic { 1190d4976104SJanusz Dziedzic struct sk_buff *skb; 1191d4976104SJanusz Dziedzic u32 cmd_id; 1192d4976104SJanusz Dziedzic 1193d4976104SJanusz Dziedzic if (!ar->wmi.ops->gen_wow_add_pattern) 1194d4976104SJanusz Dziedzic return -EOPNOTSUPP; 1195d4976104SJanusz Dziedzic 1196d4976104SJanusz Dziedzic skb = ar->wmi.ops->gen_wow_add_pattern(ar, vdev_id, pattern_id, 1197d4976104SJanusz Dziedzic pattern, mask, pattern_len, 1198d4976104SJanusz Dziedzic pattern_offset); 1199d4976104SJanusz Dziedzic if (IS_ERR(skb)) 1200d4976104SJanusz Dziedzic return PTR_ERR(skb); 1201d4976104SJanusz Dziedzic 1202d4976104SJanusz Dziedzic cmd_id = ar->wmi.cmd->wow_add_wake_pattern_cmdid; 1203d4976104SJanusz Dziedzic return ath10k_wmi_cmd_send(ar, skb, cmd_id); 1204d4976104SJanusz Dziedzic } 1205d4976104SJanusz Dziedzic 1206d4976104SJanusz Dziedzic static inline int 1207d4976104SJanusz Dziedzic ath10k_wmi_wow_del_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id) 1208d4976104SJanusz Dziedzic { 1209d4976104SJanusz Dziedzic struct sk_buff *skb; 1210d4976104SJanusz Dziedzic u32 cmd_id; 1211d4976104SJanusz Dziedzic 1212d4976104SJanusz Dziedzic if (!ar->wmi.ops->gen_wow_del_pattern) 1213d4976104SJanusz Dziedzic return -EOPNOTSUPP; 1214d4976104SJanusz Dziedzic 1215d4976104SJanusz Dziedzic skb = ar->wmi.ops->gen_wow_del_pattern(ar, vdev_id, pattern_id); 1216d4976104SJanusz Dziedzic if (IS_ERR(skb)) 1217d4976104SJanusz Dziedzic return PTR_ERR(skb); 1218d4976104SJanusz Dziedzic 1219d4976104SJanusz Dziedzic cmd_id = ar->wmi.cmd->wow_del_wake_pattern_cmdid; 1220d4976104SJanusz Dziedzic return ath10k_wmi_cmd_send(ar, skb, cmd_id); 1221d4976104SJanusz Dziedzic } 1222ad45c888SMarek Puzyniak 1223ad45c888SMarek Puzyniak static inline int 1224ad45c888SMarek Puzyniak ath10k_wmi_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id, 1225ad45c888SMarek Puzyniak enum wmi_tdls_state state) 1226ad45c888SMarek Puzyniak { 1227ad45c888SMarek Puzyniak struct sk_buff *skb; 1228ad45c888SMarek Puzyniak 1229ad45c888SMarek Puzyniak if (!ar->wmi.ops->gen_update_fw_tdls_state) 1230ad45c888SMarek Puzyniak return -EOPNOTSUPP; 1231ad45c888SMarek Puzyniak 1232ad45c888SMarek Puzyniak skb = ar->wmi.ops->gen_update_fw_tdls_state(ar, vdev_id, state); 1233ad45c888SMarek Puzyniak if (IS_ERR(skb)) 1234ad45c888SMarek Puzyniak return PTR_ERR(skb); 1235ad45c888SMarek Puzyniak 1236ad45c888SMarek Puzyniak return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->tdls_set_state_cmdid); 1237ad45c888SMarek Puzyniak } 1238ad45c888SMarek Puzyniak 1239ad45c888SMarek Puzyniak static inline int 1240ad45c888SMarek Puzyniak ath10k_wmi_tdls_peer_update(struct ath10k *ar, 1241ad45c888SMarek Puzyniak const struct wmi_tdls_peer_update_cmd_arg *arg, 1242ad45c888SMarek Puzyniak const struct wmi_tdls_peer_capab_arg *cap, 1243ad45c888SMarek Puzyniak const struct wmi_channel_arg *chan) 1244ad45c888SMarek Puzyniak { 1245ad45c888SMarek Puzyniak struct sk_buff *skb; 1246ad45c888SMarek Puzyniak 1247ad45c888SMarek Puzyniak if (!ar->wmi.ops->gen_tdls_peer_update) 1248ad45c888SMarek Puzyniak return -EOPNOTSUPP; 1249ad45c888SMarek Puzyniak 1250ad45c888SMarek Puzyniak skb = ar->wmi.ops->gen_tdls_peer_update(ar, arg, cap, chan); 1251ad45c888SMarek Puzyniak if (IS_ERR(skb)) 1252ad45c888SMarek Puzyniak return PTR_ERR(skb); 1253ad45c888SMarek Puzyniak 1254ad45c888SMarek Puzyniak return ath10k_wmi_cmd_send(ar, skb, 1255ad45c888SMarek Puzyniak ar->wmi.cmd->tdls_peer_update_cmdid); 1256ad45c888SMarek Puzyniak } 1257ad45c888SMarek Puzyniak 12585b272e30SMichal Kazior static inline int 12595b272e30SMichal Kazior ath10k_wmi_adaptive_qcs(struct ath10k *ar, bool enable) 12605b272e30SMichal Kazior { 12615b272e30SMichal Kazior struct sk_buff *skb; 12625b272e30SMichal Kazior 12635b272e30SMichal Kazior if (!ar->wmi.ops->gen_adaptive_qcs) 12645b272e30SMichal Kazior return -EOPNOTSUPP; 12655b272e30SMichal Kazior 12665b272e30SMichal Kazior skb = ar->wmi.ops->gen_adaptive_qcs(ar, enable); 12675b272e30SMichal Kazior if (IS_ERR(skb)) 12685b272e30SMichal Kazior return PTR_ERR(skb); 12695b272e30SMichal Kazior 12705b272e30SMichal Kazior return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->adaptive_qcs_cmdid); 12715b272e30SMichal Kazior } 12725b272e30SMichal Kazior 1273d7579d12SMichal Kazior #endif 1274