brintos

brintos / linux-shallow public Read only

0
0
Text · 43.5 KiB · f3f6b59 Raw
1711 lines · c
1/* SPDX-License-Identifier: ISC */2/*3 * Copyright (c) 2005-2011 Atheros Communications Inc.4 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.5 * Copyright (c) 2018, The Linux Foundation. All rights reserved.6 */7 8#ifndef _WMI_OPS_H_9#define _WMI_OPS_H_10 11struct ath10k;12struct sk_buff;13 14struct wmi_ops {15	void (*rx)(struct ath10k *ar, struct sk_buff *skb);16	void (*map_svc)(const __le32 *in, unsigned long *out, size_t len);17	void (*map_svc_ext)(const __le32 *in, unsigned long *out, size_t len);18 19	int (*pull_scan)(struct ath10k *ar, struct sk_buff *skb,20			 struct wmi_scan_ev_arg *arg);21	int (*pull_mgmt_rx)(struct ath10k *ar, struct sk_buff *skb,22			    struct wmi_mgmt_rx_ev_arg *arg);23	int (*pull_mgmt_tx_compl)(struct ath10k *ar, struct sk_buff *skb,24				  struct wmi_tlv_mgmt_tx_compl_ev_arg *arg);25	int (*pull_mgmt_tx_bundle_compl)(26				struct ath10k *ar, struct sk_buff *skb,27				struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg *arg);28	int (*pull_ch_info)(struct ath10k *ar, struct sk_buff *skb,29			    struct wmi_ch_info_ev_arg *arg);30	int (*pull_vdev_start)(struct ath10k *ar, struct sk_buff *skb,31			       struct wmi_vdev_start_ev_arg *arg);32	int (*pull_peer_kick)(struct ath10k *ar, struct sk_buff *skb,33			      struct wmi_peer_kick_ev_arg *arg);34	int (*pull_swba)(struct ath10k *ar, struct sk_buff *skb,35			 struct wmi_swba_ev_arg *arg);36	int (*pull_phyerr_hdr)(struct ath10k *ar, struct sk_buff *skb,37			       struct wmi_phyerr_hdr_arg *arg);38	int (*pull_phyerr)(struct ath10k *ar, const void *phyerr_buf,39			   int left_len, struct wmi_phyerr_ev_arg *arg);40	int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb,41			    struct wmi_svc_rdy_ev_arg *arg);42	int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb,43			struct wmi_rdy_ev_arg *arg);44	int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb,45			     struct ath10k_fw_stats *stats);46	int (*pull_roam_ev)(struct ath10k *ar, struct sk_buff *skb,47			    struct wmi_roam_ev_arg *arg);48	int (*pull_wow_event)(struct ath10k *ar, struct sk_buff *skb,49			      struct wmi_wow_ev_arg *arg);50	int (*pull_echo_ev)(struct ath10k *ar, struct sk_buff *skb,51			    struct wmi_echo_ev_arg *arg);52	int (*pull_dfs_status_ev)(struct ath10k *ar, struct sk_buff *skb,53				  struct wmi_dfs_status_ev_arg *arg);54	int (*pull_svc_avail)(struct ath10k *ar, struct sk_buff *skb,55			      struct wmi_svc_avail_ev_arg *arg);56 57	enum wmi_txbf_conf (*get_txbf_conf_scheme)(struct ath10k *ar);58 59	struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt);60	struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar);61	struct sk_buff *(*gen_pdev_set_base_macaddr)(struct ath10k *ar,62						     const u8 macaddr[ETH_ALEN]);63	struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g,64					   u16 rd5g, u16 ctl2g, u16 ctl5g,65					   enum wmi_dfs_region dfs_reg);66	struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id,67					      u32 value);68	struct sk_buff *(*gen_init)(struct ath10k *ar);69	struct sk_buff *(*gen_start_scan)(struct ath10k *ar,70					  const struct wmi_start_scan_arg *arg);71	struct sk_buff *(*gen_stop_scan)(struct ath10k *ar,72					 const struct wmi_stop_scan_arg *arg);73	struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id,74					   enum wmi_vdev_type type,75					   enum wmi_vdev_subtype subtype,76					   const u8 macaddr[ETH_ALEN]);77	struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id);78	struct sk_buff *(*gen_vdev_start)(struct ath10k *ar,79					  const struct wmi_vdev_start_request_arg *arg,80					  bool restart);81	struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id);82	struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid,83				       const u8 *bssid);84	struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id);85	struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id,86					      u32 param_id, u32 param_value);87	struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar,88						const struct wmi_vdev_install_key_arg *arg);89	struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar,90						  const struct wmi_vdev_spectral_conf_arg *arg);91	struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id,92						    u32 trigger, u32 enable);93	struct sk_buff *(*gen_vdev_wmm_conf)(struct ath10k *ar, u32 vdev_id,94					     const struct wmi_wmm_params_all_arg *arg);95	struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id,96					   const u8 peer_addr[ETH_ALEN],97					   enum wmi_peer_type peer_type);98	struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id,99					   const u8 peer_addr[ETH_ALEN]);100	struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id,101					  const u8 peer_addr[ETH_ALEN],102					  u32 tid_bitmap);103	struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id,104					      const u8 *peer_addr,105					      enum wmi_peer_param param_id,106					      u32 param_value);107	struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar,108					  const struct wmi_peer_assoc_complete_arg *arg);109	struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id,110					  enum wmi_sta_ps_mode psmode);111	struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id,112					  enum wmi_sta_powersave_param param_id,113					  u32 value);114	struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id,115					 const u8 *mac,116					 enum wmi_ap_ps_peer_param param_id,117					 u32 value);118	struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar,119					      const struct wmi_scan_chan_list_arg *arg);120	struct sk_buff *(*gen_scan_prob_req_oui)(struct ath10k *ar,121						 u32 prob_req_oui);122	struct sk_buff *(*gen_beacon_dma)(struct ath10k *ar, u32 vdev_id,123					  const void *bcn, size_t bcn_len,124					  u32 bcn_paddr, bool dtim_zero,125					  bool deliver_cab);126	struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,127					    const struct wmi_wmm_params_all_arg *arg);128	struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask);129	struct sk_buff *(*gen_request_peer_stats_info)(struct ath10k *ar,130						       u32 vdev_id,131						       enum132						       wmi_peer_stats_info_request_type133						       type,134						       u8 *addr,135						       u32 reset);136	struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,137					     enum wmi_force_fw_hang_type type,138					     u32 delay_ms);139	struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb);140	struct sk_buff *(*gen_mgmt_tx_send)(struct ath10k *ar,141					    struct sk_buff *skb,142					    dma_addr_t paddr);143	int (*cleanup_mgmt_tx_send)(struct ath10k *ar, struct sk_buff *msdu);144	struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u64 module_enable,145					  u32 log_level);146	struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter);147	struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar);148	struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar,149						   u32 period, u32 duration,150						   u32 next_offset,151						   u32 enabled);152	struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar);153	struct sk_buff *(*gen_addba_clear_resp)(struct ath10k *ar, u32 vdev_id,154						const u8 *mac);155	struct sk_buff *(*gen_addba_send)(struct ath10k *ar, u32 vdev_id,156					  const u8 *mac, u32 tid, u32 buf_size);157	struct sk_buff *(*gen_addba_set_resp)(struct ath10k *ar, u32 vdev_id,158					      const u8 *mac, u32 tid,159					      u32 status);160	struct sk_buff *(*gen_delba_send)(struct ath10k *ar, u32 vdev_id,161					  const u8 *mac, u32 tid, u32 initiator,162					  u32 reason);163	struct sk_buff *(*gen_bcn_tmpl)(struct ath10k *ar, u32 vdev_id,164					u32 tim_ie_offset, struct sk_buff *bcn,165					u32 prb_caps, u32 prb_erp,166					void *prb_ies, size_t prb_ies_len);167	struct sk_buff *(*gen_prb_tmpl)(struct ath10k *ar, u32 vdev_id,168					struct sk_buff *bcn);169	struct sk_buff *(*gen_p2p_go_bcn_ie)(struct ath10k *ar, u32 vdev_id,170					     const u8 *p2p_ie);171	struct sk_buff *(*gen_vdev_sta_uapsd)(struct ath10k *ar, u32 vdev_id,172					      const u8 peer_addr[ETH_ALEN],173					      const struct wmi_sta_uapsd_auto_trig_arg *args,174					      u32 num_ac);175	struct sk_buff *(*gen_sta_keepalive)(struct ath10k *ar,176					     const struct wmi_sta_keepalive_arg *arg);177	struct sk_buff *(*gen_wow_enable)(struct ath10k *ar);178	struct sk_buff *(*gen_wow_add_wakeup_event)(struct ath10k *ar, u32 vdev_id,179						    enum wmi_wow_wakeup_event event,180						    u32 enable);181	struct sk_buff *(*gen_wow_host_wakeup_ind)(struct ath10k *ar);182	struct sk_buff *(*gen_wow_add_pattern)(struct ath10k *ar, u32 vdev_id,183					       u32 pattern_id,184					       const u8 *pattern,185					       const u8 *mask,186					       int pattern_len,187					       int pattern_offset);188	struct sk_buff *(*gen_wow_del_pattern)(struct ath10k *ar, u32 vdev_id,189					       u32 pattern_id);190	struct sk_buff *(*gen_update_fw_tdls_state)(struct ath10k *ar,191						    u32 vdev_id,192						    enum wmi_tdls_state state);193	struct sk_buff *(*gen_tdls_peer_update)(struct ath10k *ar,194						const struct wmi_tdls_peer_update_cmd_arg *arg,195						const struct wmi_tdls_peer_capab_arg *cap,196						const struct wmi_channel_arg *chan);197	struct sk_buff *(*gen_radar_found)198			(struct ath10k *ar,199			 const struct ath10k_radar_found_info *arg);200	struct sk_buff *(*gen_adaptive_qcs)(struct ath10k *ar, bool enable);201	struct sk_buff *(*gen_pdev_get_tpc_config)(struct ath10k *ar,202						   u32 param);203	void (*fw_stats_fill)(struct ath10k *ar,204			      struct ath10k_fw_stats *fw_stats,205			      char *buf);206	struct sk_buff *(*gen_pdev_enable_adaptive_cca)(struct ath10k *ar,207							u8 enable,208							u32 detect_level,209							u32 detect_margin);210	struct sk_buff *(*ext_resource_config)(struct ath10k *ar,211					       enum wmi_host_platform_type type,212					       u32 fw_feature_bitmap);213	int (*get_vdev_subtype)(struct ath10k *ar,214				enum wmi_vdev_subtype subtype);215	struct sk_buff *(*gen_wow_config_pno)(struct ath10k *ar,216					      u32 vdev_id,217					      struct wmi_pno_scan_req *pno_scan);218	struct sk_buff *(*gen_pdev_bss_chan_info_req)219					(struct ath10k *ar,220					 enum wmi_bss_survey_req_type type);221	struct sk_buff *(*gen_echo)(struct ath10k *ar, u32 value);222	struct sk_buff *(*gen_pdev_get_tpc_table_cmdid)(struct ath10k *ar,223							u32 param);224	struct sk_buff *(*gen_bb_timing)225			(struct ath10k *ar,226			 const struct wmi_bb_timing_cfg_arg *arg);227	struct sk_buff *(*gen_per_peer_per_tid_cfg)(struct ath10k *ar,228						    const struct wmi_per_peer_per_tid_cfg_arg *arg);229	struct sk_buff *(*gen_gpio_config)(struct ath10k *ar, u32 gpio_num,230					   u32 input, u32 pull_type, u32 intr_mode);231 232	struct sk_buff *(*gen_gpio_output)(struct ath10k *ar, u32 gpio_num, u32 set);233};234 235int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);236 237static inline int238ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb)239{240	if (WARN_ON_ONCE(!ar->wmi.ops->rx))241		return -EOPNOTSUPP;242 243	ar->wmi.ops->rx(ar, skb);244	return 0;245}246 247static inline int248ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out,249		   size_t len)250{251	if (!ar->wmi.ops->map_svc)252		return -EOPNOTSUPP;253 254	ar->wmi.ops->map_svc(in, out, len);255	return 0;256}257 258static inline int259ath10k_wmi_map_svc_ext(struct ath10k *ar, const __le32 *in, unsigned long *out,260		       size_t len)261{262	if (!ar->wmi.ops->map_svc_ext)263		return -EOPNOTSUPP;264 265	ar->wmi.ops->map_svc_ext(in, out, len);266	return 0;267}268 269static inline int270ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb,271		     struct wmi_scan_ev_arg *arg)272{273	if (!ar->wmi.ops->pull_scan)274		return -EOPNOTSUPP;275 276	return ar->wmi.ops->pull_scan(ar, skb, arg);277}278 279static inline int280ath10k_wmi_pull_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb,281			      struct wmi_tlv_mgmt_tx_compl_ev_arg *arg)282{283	if (!ar->wmi.ops->pull_mgmt_tx_compl)284		return -EOPNOTSUPP;285 286	return ar->wmi.ops->pull_mgmt_tx_compl(ar, skb, arg);287}288 289static inline int290ath10k_wmi_pull_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb,291				     struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg *arg)292{293	if (!ar->wmi.ops->pull_mgmt_tx_bundle_compl)294		return -EOPNOTSUPP;295 296	return ar->wmi.ops->pull_mgmt_tx_bundle_compl(ar, skb, arg);297}298 299static inline int300ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb,301			struct wmi_mgmt_rx_ev_arg *arg)302{303	if (!ar->wmi.ops->pull_mgmt_rx)304		return -EOPNOTSUPP;305 306	return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg);307}308 309static inline int310ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb,311			struct wmi_ch_info_ev_arg *arg)312{313	if (!ar->wmi.ops->pull_ch_info)314		return -EOPNOTSUPP;315 316	return ar->wmi.ops->pull_ch_info(ar, skb, arg);317}318 319static inline int320ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb,321			   struct wmi_vdev_start_ev_arg *arg)322{323	if (!ar->wmi.ops->pull_vdev_start)324		return -EOPNOTSUPP;325 326	return ar->wmi.ops->pull_vdev_start(ar, skb, arg);327}328 329static inline int330ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb,331			  struct wmi_peer_kick_ev_arg *arg)332{333	if (!ar->wmi.ops->pull_peer_kick)334		return -EOPNOTSUPP;335 336	return ar->wmi.ops->pull_peer_kick(ar, skb, arg);337}338 339static inline int340ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb,341		     struct wmi_swba_ev_arg *arg)342{343	if (!ar->wmi.ops->pull_swba)344		return -EOPNOTSUPP;345 346	return ar->wmi.ops->pull_swba(ar, skb, arg);347}348 349static inline int350ath10k_wmi_pull_phyerr_hdr(struct ath10k *ar, struct sk_buff *skb,351			   struct wmi_phyerr_hdr_arg *arg)352{353	if (!ar->wmi.ops->pull_phyerr_hdr)354		return -EOPNOTSUPP;355 356	return ar->wmi.ops->pull_phyerr_hdr(ar, skb, arg);357}358 359static inline int360ath10k_wmi_pull_phyerr(struct ath10k *ar, const void *phyerr_buf,361		       int left_len, struct wmi_phyerr_ev_arg *arg)362{363	if (!ar->wmi.ops->pull_phyerr)364		return -EOPNOTSUPP;365 366	return ar->wmi.ops->pull_phyerr(ar, phyerr_buf, left_len, arg);367}368 369static inline int370ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb,371			struct wmi_svc_rdy_ev_arg *arg)372{373	if (!ar->wmi.ops->pull_svc_rdy)374		return -EOPNOTSUPP;375 376	return ar->wmi.ops->pull_svc_rdy(ar, skb, arg);377}378 379static inline int380ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb,381		    struct wmi_rdy_ev_arg *arg)382{383	if (!ar->wmi.ops->pull_rdy)384		return -EOPNOTSUPP;385 386	return ar->wmi.ops->pull_rdy(ar, skb, arg);387}388 389static inline int390ath10k_wmi_pull_svc_avail(struct ath10k *ar, struct sk_buff *skb,391			  struct wmi_svc_avail_ev_arg *arg)392{393	if (!ar->wmi.ops->pull_svc_avail)394		return -EOPNOTSUPP;395	return ar->wmi.ops->pull_svc_avail(ar, skb, arg);396}397 398static inline int399ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,400			 struct ath10k_fw_stats *stats)401{402	if (!ar->wmi.ops->pull_fw_stats)403		return -EOPNOTSUPP;404 405	return ar->wmi.ops->pull_fw_stats(ar, skb, stats);406}407 408static inline int409ath10k_wmi_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,410			struct wmi_roam_ev_arg *arg)411{412	if (!ar->wmi.ops->pull_roam_ev)413		return -EOPNOTSUPP;414 415	return ar->wmi.ops->pull_roam_ev(ar, skb, arg);416}417 418static inline int419ath10k_wmi_pull_wow_event(struct ath10k *ar, struct sk_buff *skb,420			  struct wmi_wow_ev_arg *arg)421{422	if (!ar->wmi.ops->pull_wow_event)423		return -EOPNOTSUPP;424 425	return ar->wmi.ops->pull_wow_event(ar, skb, arg);426}427 428static inline int429ath10k_wmi_pull_echo_ev(struct ath10k *ar, struct sk_buff *skb,430			struct wmi_echo_ev_arg *arg)431{432	if (!ar->wmi.ops->pull_echo_ev)433		return -EOPNOTSUPP;434 435	return ar->wmi.ops->pull_echo_ev(ar, skb, arg);436}437 438static inline int439ath10k_wmi_pull_dfs_status(struct ath10k *ar, struct sk_buff *skb,440			   struct wmi_dfs_status_ev_arg *arg)441{442	if (!ar->wmi.ops->pull_dfs_status_ev)443		return -EOPNOTSUPP;444 445	return ar->wmi.ops->pull_dfs_status_ev(ar, skb, arg);446}447 448static inline enum wmi_txbf_conf449ath10k_wmi_get_txbf_conf_scheme(struct ath10k *ar)450{451	if (!ar->wmi.ops->get_txbf_conf_scheme)452		return WMI_TXBF_CONF_UNSUPPORTED;453 454	return ar->wmi.ops->get_txbf_conf_scheme(ar);455}456 457static inline int458ath10k_wmi_cleanup_mgmt_tx_send(struct ath10k *ar, struct sk_buff *msdu)459{460	if (!ar->wmi.ops->cleanup_mgmt_tx_send)461		return -EOPNOTSUPP;462 463	return ar->wmi.ops->cleanup_mgmt_tx_send(ar, msdu);464}465 466static inline int467ath10k_wmi_mgmt_tx_send(struct ath10k *ar, struct sk_buff *msdu,468			dma_addr_t paddr)469{470	struct sk_buff *skb;471	int ret;472 473	if (!ar->wmi.ops->gen_mgmt_tx_send)474		return -EOPNOTSUPP;475 476	skb = ar->wmi.ops->gen_mgmt_tx_send(ar, msdu, paddr);477	if (IS_ERR(skb))478		return PTR_ERR(skb);479 480	ret = ath10k_wmi_cmd_send(ar, skb,481				  ar->wmi.cmd->mgmt_tx_send_cmdid);482	if (ret)483		return ret;484 485	return 0;486}487 488static inline int489ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)490{491	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);492	struct sk_buff *skb;493	int ret;494 495	if (!ar->wmi.ops->gen_mgmt_tx)496		return -EOPNOTSUPP;497 498	skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu);499	if (IS_ERR(skb))500		return PTR_ERR(skb);501 502	ret = ath10k_wmi_cmd_send(ar, skb,503				  ar->wmi.cmd->mgmt_tx_cmdid);504	if (ret)505		return ret;506 507	/* FIXME There's no ACK event for Management Tx. This probably508	 * shouldn't be called here either.509	 */510	info->flags |= IEEE80211_TX_STAT_ACK;511	ieee80211_tx_status_irqsafe(ar->hw, msdu);512 513	return 0;514}515 516static inline int517ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,518			      u16 ctl2g, u16 ctl5g,519			      enum wmi_dfs_region dfs_reg)520{521	struct sk_buff *skb;522 523	if (!ar->wmi.ops->gen_pdev_set_rd)524		return -EOPNOTSUPP;525 526	skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g,527					   dfs_reg);528	if (IS_ERR(skb))529		return PTR_ERR(skb);530 531	return ath10k_wmi_cmd_send(ar, skb,532				   ar->wmi.cmd->pdev_set_regdomain_cmdid);533}534 535static inline int536ath10k_wmi_pdev_set_base_macaddr(struct ath10k *ar, const u8 macaddr[ETH_ALEN])537{538	struct sk_buff *skb;539 540	if (!ar->wmi.ops->gen_pdev_set_base_macaddr)541		return -EOPNOTSUPP;542 543	skb = ar->wmi.ops->gen_pdev_set_base_macaddr(ar, macaddr);544	if (IS_ERR(skb))545		return PTR_ERR(skb);546 547	return ath10k_wmi_cmd_send(ar, skb,548				   ar->wmi.cmd->pdev_set_base_macaddr_cmdid);549}550 551static inline int552ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt)553{554	struct sk_buff *skb;555 556	if (!ar->wmi.ops->gen_pdev_suspend)557		return -EOPNOTSUPP;558 559	skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt);560	if (IS_ERR(skb))561		return PTR_ERR(skb);562 563	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);564}565 566static inline int567ath10k_wmi_pdev_resume_target(struct ath10k *ar)568{569	struct sk_buff *skb;570 571	if (!ar->wmi.ops->gen_pdev_resume)572		return -EOPNOTSUPP;573 574	skb = ar->wmi.ops->gen_pdev_resume(ar);575	if (IS_ERR(skb))576		return PTR_ERR(skb);577 578	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);579}580 581static inline int582ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)583{584	struct sk_buff *skb;585 586	if (!ar->wmi.ops->gen_pdev_set_param)587		return -EOPNOTSUPP;588 589	skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value);590	if (IS_ERR(skb))591		return PTR_ERR(skb);592 593	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);594}595 596static inline int597ath10k_wmi_cmd_init(struct ath10k *ar)598{599	struct sk_buff *skb;600 601	if (!ar->wmi.ops->gen_init)602		return -EOPNOTSUPP;603 604	skb = ar->wmi.ops->gen_init(ar);605	if (IS_ERR(skb))606		return PTR_ERR(skb);607 608	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid);609}610 611static inline int612ath10k_wmi_start_scan(struct ath10k *ar,613		      const struct wmi_start_scan_arg *arg)614{615	struct sk_buff *skb;616 617	if (!ar->wmi.ops->gen_start_scan)618		return -EOPNOTSUPP;619 620	skb = ar->wmi.ops->gen_start_scan(ar, arg);621	if (IS_ERR(skb))622		return PTR_ERR(skb);623 624	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);625}626 627static inline int628ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg)629{630	struct sk_buff *skb;631 632	if (!ar->wmi.ops->gen_stop_scan)633		return -EOPNOTSUPP;634 635	skb = ar->wmi.ops->gen_stop_scan(ar, arg);636	if (IS_ERR(skb))637		return PTR_ERR(skb);638 639	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);640}641 642static inline int643ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,644		       enum wmi_vdev_type type,645		       enum wmi_vdev_subtype subtype,646		       const u8 macaddr[ETH_ALEN])647{648	struct sk_buff *skb;649 650	if (!ar->wmi.ops->gen_vdev_create)651		return -EOPNOTSUPP;652 653	skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr);654	if (IS_ERR(skb))655		return PTR_ERR(skb);656 657	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);658}659 660static inline int661ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)662{663	struct sk_buff *skb;664 665	if (!ar->wmi.ops->gen_vdev_delete)666		return -EOPNOTSUPP;667 668	skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id);669	if (IS_ERR(skb))670		return PTR_ERR(skb);671 672	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);673}674 675static inline int676ath10k_wmi_vdev_start(struct ath10k *ar,677		      const struct wmi_vdev_start_request_arg *arg)678{679	struct sk_buff *skb;680 681	if (!ar->wmi.ops->gen_vdev_start)682		return -EOPNOTSUPP;683 684	skb = ar->wmi.ops->gen_vdev_start(ar, arg, false);685	if (IS_ERR(skb))686		return PTR_ERR(skb);687 688	return ath10k_wmi_cmd_send(ar, skb,689				   ar->wmi.cmd->vdev_start_request_cmdid);690}691 692static inline int693ath10k_wmi_vdev_restart(struct ath10k *ar,694			const struct wmi_vdev_start_request_arg *arg)695{696	struct sk_buff *skb;697 698	if (!ar->wmi.ops->gen_vdev_start)699		return -EOPNOTSUPP;700 701	skb = ar->wmi.ops->gen_vdev_start(ar, arg, true);702	if (IS_ERR(skb))703		return PTR_ERR(skb);704 705	return ath10k_wmi_cmd_send(ar, skb,706				   ar->wmi.cmd->vdev_restart_request_cmdid);707}708 709static inline int710ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)711{712	struct sk_buff *skb;713 714	if (!ar->wmi.ops->gen_vdev_stop)715		return -EOPNOTSUPP;716 717	skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id);718	if (IS_ERR(skb))719		return PTR_ERR(skb);720 721	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid);722}723 724static inline int725ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)726{727	struct sk_buff *skb;728 729	if (!ar->wmi.ops->gen_vdev_up)730		return -EOPNOTSUPP;731 732	skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid);733	if (IS_ERR(skb))734		return PTR_ERR(skb);735 736	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid);737}738 739static inline int740ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)741{742	struct sk_buff *skb;743 744	if (!ar->wmi.ops->gen_vdev_down)745		return -EOPNOTSUPP;746 747	skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id);748	if (IS_ERR(skb))749		return PTR_ERR(skb);750 751	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);752}753 754static inline int755ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id,756			  u32 param_value)757{758	struct sk_buff *skb;759 760	if (!ar->wmi.ops->gen_vdev_set_param)761		return -EOPNOTSUPP;762 763	skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id,764					      param_value);765	if (IS_ERR(skb))766		return PTR_ERR(skb);767 768	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);769}770 771static inline int772ath10k_wmi_vdev_install_key(struct ath10k *ar,773			    const struct wmi_vdev_install_key_arg *arg)774{775	struct sk_buff *skb;776 777	if (!ar->wmi.ops->gen_vdev_install_key)778		return -EOPNOTSUPP;779 780	skb = ar->wmi.ops->gen_vdev_install_key(ar, arg);781	if (IS_ERR(skb))782		return PTR_ERR(skb);783 784	return ath10k_wmi_cmd_send(ar, skb,785				   ar->wmi.cmd->vdev_install_key_cmdid);786}787 788static inline int789ath10k_wmi_vdev_spectral_conf(struct ath10k *ar,790			      const struct wmi_vdev_spectral_conf_arg *arg)791{792	struct sk_buff *skb;793	u32 cmd_id;794 795	if (!ar->wmi.ops->gen_vdev_spectral_conf)796		return -EOPNOTSUPP;797 798	skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg);799	if (IS_ERR(skb))800		return PTR_ERR(skb);801 802	cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid;803	return ath10k_wmi_cmd_send(ar, skb, cmd_id);804}805 806static inline int807ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger,808				u32 enable)809{810	struct sk_buff *skb;811	u32 cmd_id;812 813	if (!ar->wmi.ops->gen_vdev_spectral_enable)814		return -EOPNOTSUPP;815 816	skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger,817						    enable);818	if (IS_ERR(skb))819		return PTR_ERR(skb);820 821	cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid;822	return ath10k_wmi_cmd_send(ar, skb, cmd_id);823}824 825static inline int826ath10k_wmi_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id,827			  const u8 peer_addr[ETH_ALEN],828			  const struct wmi_sta_uapsd_auto_trig_arg *args,829			  u32 num_ac)830{831	struct sk_buff *skb;832	u32 cmd_id;833 834	if (!ar->wmi.ops->gen_vdev_sta_uapsd)835		return -EOPNOTSUPP;836 837	skb = ar->wmi.ops->gen_vdev_sta_uapsd(ar, vdev_id, peer_addr, args,838					      num_ac);839	if (IS_ERR(skb))840		return PTR_ERR(skb);841 842	cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid;843	return ath10k_wmi_cmd_send(ar, skb, cmd_id);844}845 846static inline int847ath10k_wmi_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id,848			 const struct wmi_wmm_params_all_arg *arg)849{850	struct sk_buff *skb;851	u32 cmd_id;852 853	skb = ar->wmi.ops->gen_vdev_wmm_conf(ar, vdev_id, arg);854	if (IS_ERR(skb))855		return PTR_ERR(skb);856 857	cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid;858	return ath10k_wmi_cmd_send(ar, skb, cmd_id);859}860 861static inline int862ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,863		       const u8 peer_addr[ETH_ALEN],864		       enum wmi_peer_type peer_type)865{866	struct sk_buff *skb;867 868	if (!ar->wmi.ops->gen_peer_create)869		return -EOPNOTSUPP;870 871	skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr, peer_type);872	if (IS_ERR(skb))873		return PTR_ERR(skb);874 875	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);876}877 878static inline int879ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,880		       const u8 peer_addr[ETH_ALEN])881{882	struct sk_buff *skb;883 884	if (!ar->wmi.ops->gen_peer_delete)885		return -EOPNOTSUPP;886 887	skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr);888	if (IS_ERR(skb))889		return PTR_ERR(skb);890 891	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid);892}893 894static inline int895ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,896		      const u8 peer_addr[ETH_ALEN], u32 tid_bitmap)897{898	struct sk_buff *skb;899 900	if (!ar->wmi.ops->gen_peer_flush)901		return -EOPNOTSUPP;902 903	skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap);904	if (IS_ERR(skb))905		return PTR_ERR(skb);906 907	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);908}909 910static inline int911ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr,912			  enum wmi_peer_param param_id, u32 param_value)913{914	struct sk_buff *skb;915 916	if (!ar->wmi.ops->gen_peer_set_param)917		return -EOPNOTSUPP;918 919	skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id,920					      param_value);921	if (IS_ERR(skb))922		return PTR_ERR(skb);923 924	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);925}926 927static inline int928ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,929		      enum wmi_sta_ps_mode psmode)930{931	struct sk_buff *skb;932 933	if (!ar->wmi.ops->gen_set_psmode)934		return -EOPNOTSUPP;935 936	skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode);937	if (IS_ERR(skb))938		return PTR_ERR(skb);939 940	return ath10k_wmi_cmd_send(ar, skb,941				   ar->wmi.cmd->sta_powersave_mode_cmdid);942}943 944static inline int945ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,946			    enum wmi_sta_powersave_param param_id, u32 value)947{948	struct sk_buff *skb;949 950	if (!ar->wmi.ops->gen_set_sta_ps)951		return -EOPNOTSUPP;952 953	skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value);954	if (IS_ERR(skb))955		return PTR_ERR(skb);956 957	return ath10k_wmi_cmd_send(ar, skb,958				   ar->wmi.cmd->sta_powersave_param_cmdid);959}960 961static inline int962ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,963			   enum wmi_ap_ps_peer_param param_id, u32 value)964{965	struct sk_buff *skb;966 967	if (!ar->wmi.ops->gen_set_ap_ps)968		return -EOPNOTSUPP;969 970	skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value);971	if (IS_ERR(skb))972		return PTR_ERR(skb);973 974	return ath10k_wmi_cmd_send(ar, skb,975				   ar->wmi.cmd->ap_ps_peer_param_cmdid);976}977 978static inline int979ath10k_wmi_scan_chan_list(struct ath10k *ar,980			  const struct wmi_scan_chan_list_arg *arg)981{982	struct sk_buff *skb;983 984	if (!ar->wmi.ops->gen_scan_chan_list)985		return -EOPNOTSUPP;986 987	skb = ar->wmi.ops->gen_scan_chan_list(ar, arg);988	if (IS_ERR(skb))989		return PTR_ERR(skb);990 991	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);992}993 994static inline int995ath10k_wmi_scan_prob_req_oui(struct ath10k *ar, const u8 mac_addr[ETH_ALEN])996{997	struct sk_buff *skb;998	u32 prob_req_oui;999 1000	prob_req_oui = (((u32)mac_addr[0]) << 16) |1001		       (((u32)mac_addr[1]) << 8) | mac_addr[2];1002 1003	if (!ar->wmi.ops->gen_scan_prob_req_oui)1004		return -EOPNOTSUPP;1005 1006	skb = ar->wmi.ops->gen_scan_prob_req_oui(ar, prob_req_oui);1007	if (IS_ERR(skb))1008		return PTR_ERR(skb);1009 1010	return ath10k_wmi_cmd_send(ar, skb,1011			ar->wmi.cmd->scan_prob_req_oui_cmdid);1012}1013 1014static inline int1015ath10k_wmi_peer_assoc(struct ath10k *ar,1016		      const struct wmi_peer_assoc_complete_arg *arg)1017{1018	struct sk_buff *skb;1019 1020	if (!ar->wmi.ops->gen_peer_assoc)1021		return -EOPNOTSUPP;1022 1023	skb = ar->wmi.ops->gen_peer_assoc(ar, arg);1024	if (IS_ERR(skb))1025		return PTR_ERR(skb);1026 1027	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);1028}1029 1030static inline int1031ath10k_wmi_beacon_send_ref_nowait(struct ath10k *ar, u32 vdev_id,1032				  const void *bcn, size_t bcn_len,1033				  u32 bcn_paddr, bool dtim_zero,1034				  bool deliver_cab)1035{1036	struct sk_buff *skb;1037	int ret;1038 1039	if (!ar->wmi.ops->gen_beacon_dma)1040		return -EOPNOTSUPP;1041 1042	skb = ar->wmi.ops->gen_beacon_dma(ar, vdev_id, bcn, bcn_len, bcn_paddr,1043					  dtim_zero, deliver_cab);1044	if (IS_ERR(skb))1045		return PTR_ERR(skb);1046 1047	ret = ath10k_wmi_cmd_send_nowait(ar, skb,1048					 ar->wmi.cmd->pdev_send_bcn_cmdid);1049	if (ret) {1050		dev_kfree_skb(skb);1051		return ret;1052	}1053 1054	return 0;1055}1056 1057static inline int1058ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,1059			       const struct wmi_wmm_params_all_arg *arg)1060{1061	struct sk_buff *skb;1062 1063	if (!ar->wmi.ops->gen_pdev_set_wmm)1064		return -EOPNOTSUPP;1065 1066	skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg);1067	if (IS_ERR(skb))1068		return PTR_ERR(skb);1069 1070	return ath10k_wmi_cmd_send(ar, skb,1071				   ar->wmi.cmd->pdev_set_wmm_params_cmdid);1072}1073 1074static inline int1075ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask)1076{1077	struct sk_buff *skb;1078 1079	if (!ar->wmi.ops->gen_request_stats)1080		return -EOPNOTSUPP;1081 1082	skb = ar->wmi.ops->gen_request_stats(ar, stats_mask);1083	if (IS_ERR(skb))1084		return PTR_ERR(skb);1085 1086	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);1087}1088 1089static inline int1090ath10k_wmi_request_peer_stats_info(struct ath10k *ar,1091				   u32 vdev_id,1092				   enum wmi_peer_stats_info_request_type type,1093				   u8 *addr,1094				   u32 reset)1095{1096	struct sk_buff *skb;1097 1098	if (!ar->wmi.ops->gen_request_peer_stats_info)1099		return -EOPNOTSUPP;1100 1101	skb = ar->wmi.ops->gen_request_peer_stats_info(ar,1102						       vdev_id,1103						       type,1104						       addr,1105						       reset);1106	if (IS_ERR(skb))1107		return PTR_ERR(skb);1108 1109	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_peer_stats_info_cmdid);1110}1111 1112static inline int1113ath10k_wmi_force_fw_hang(struct ath10k *ar,1114			 enum wmi_force_fw_hang_type type, u32 delay_ms)1115{1116	struct sk_buff *skb;1117 1118	if (!ar->wmi.ops->gen_force_fw_hang)1119		return -EOPNOTSUPP;1120 1121	skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms);1122	if (IS_ERR(skb))1123		return PTR_ERR(skb);1124 1125	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);1126}1127 1128static inline int ath10k_wmi_gpio_config(struct ath10k *ar, u32 gpio_num,1129					 u32 input, u32 pull_type, u32 intr_mode)1130{1131	struct sk_buff *skb;1132 1133	if (!ar->wmi.ops->gen_gpio_config)1134		return -EOPNOTSUPP;1135 1136	skb = ar->wmi.ops->gen_gpio_config(ar, gpio_num, input, pull_type, intr_mode);1137	if (IS_ERR(skb))1138		return PTR_ERR(skb);1139 1140	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_config_cmdid);1141}1142 1143static inline int ath10k_wmi_gpio_output(struct ath10k *ar, u32 gpio_num, u32 set)1144{1145	struct sk_buff *skb;1146 1147	if (!ar->wmi.ops->gen_gpio_config)1148		return -EOPNOTSUPP;1149 1150	skb = ar->wmi.ops->gen_gpio_output(ar, gpio_num, set);1151	if (IS_ERR(skb))1152		return PTR_ERR(skb);1153 1154	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_output_cmdid);1155}1156 1157static inline int1158ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level)1159{1160	struct sk_buff *skb;1161 1162	if (!ar->wmi.ops->gen_dbglog_cfg)1163		return -EOPNOTSUPP;1164 1165	skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level);1166	if (IS_ERR(skb))1167		return PTR_ERR(skb);1168 1169	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid);1170}1171 1172static inline int1173ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter)1174{1175	struct sk_buff *skb;1176 1177	if (!ar->wmi.ops->gen_pktlog_enable)1178		return -EOPNOTSUPP;1179 1180	skb = ar->wmi.ops->gen_pktlog_enable(ar, filter);1181	if (IS_ERR(skb))1182		return PTR_ERR(skb);1183 1184	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid);1185}1186 1187static inline int1188ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar)1189{1190	struct sk_buff *skb;1191 1192	if (!ar->wmi.ops->gen_pktlog_disable)1193		return -EOPNOTSUPP;1194 1195	skb = ar->wmi.ops->gen_pktlog_disable(ar);1196	if (IS_ERR(skb))1197		return PTR_ERR(skb);1198 1199	return ath10k_wmi_cmd_send(ar, skb,1200				   ar->wmi.cmd->pdev_pktlog_disable_cmdid);1201}1202 1203static inline int1204ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration,1205			       u32 next_offset, u32 enabled)1206{1207	struct sk_buff *skb;1208 1209	if (!ar->wmi.ops->gen_pdev_set_quiet_mode)1210		return -EOPNOTSUPP;1211 1212	skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration,1213						   next_offset, enabled);1214	if (IS_ERR(skb))1215		return PTR_ERR(skb);1216 1217	return ath10k_wmi_cmd_send(ar, skb,1218				   ar->wmi.cmd->pdev_set_quiet_mode_cmdid);1219}1220 1221static inline int1222ath10k_wmi_pdev_get_temperature(struct ath10k *ar)1223{1224	struct sk_buff *skb;1225 1226	if (!ar->wmi.ops->gen_pdev_get_temperature)1227		return -EOPNOTSUPP;1228 1229	skb = ar->wmi.ops->gen_pdev_get_temperature(ar);1230	if (IS_ERR(skb))1231		return PTR_ERR(skb);1232 1233	return ath10k_wmi_cmd_send(ar, skb,1234				   ar->wmi.cmd->pdev_get_temperature_cmdid);1235}1236 1237static inline int1238ath10k_wmi_addba_clear_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac)1239{1240	struct sk_buff *skb;1241 1242	if (!ar->wmi.ops->gen_addba_clear_resp)1243		return -EOPNOTSUPP;1244 1245	skb = ar->wmi.ops->gen_addba_clear_resp(ar, vdev_id, mac);1246	if (IS_ERR(skb))1247		return PTR_ERR(skb);1248 1249	return ath10k_wmi_cmd_send(ar, skb,1250				   ar->wmi.cmd->addba_clear_resp_cmdid);1251}1252 1253static inline int1254ath10k_wmi_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,1255		      u32 tid, u32 buf_size)1256{1257	struct sk_buff *skb;1258 1259	if (!ar->wmi.ops->gen_addba_send)1260		return -EOPNOTSUPP;1261 1262	skb = ar->wmi.ops->gen_addba_send(ar, vdev_id, mac, tid, buf_size);1263	if (IS_ERR(skb))1264		return PTR_ERR(skb);1265 1266	return ath10k_wmi_cmd_send(ar, skb,1267				   ar->wmi.cmd->addba_send_cmdid);1268}1269 1270static inline int1271ath10k_wmi_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,1272			  u32 tid, u32 status)1273{1274	struct sk_buff *skb;1275 1276	if (!ar->wmi.ops->gen_addba_set_resp)1277		return -EOPNOTSUPP;1278 1279	skb = ar->wmi.ops->gen_addba_set_resp(ar, vdev_id, mac, tid, status);1280	if (IS_ERR(skb))1281		return PTR_ERR(skb);1282 1283	return ath10k_wmi_cmd_send(ar, skb,1284				   ar->wmi.cmd->addba_set_resp_cmdid);1285}1286 1287static inline int1288ath10k_wmi_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,1289		      u32 tid, u32 initiator, u32 reason)1290{1291	struct sk_buff *skb;1292 1293	if (!ar->wmi.ops->gen_delba_send)1294		return -EOPNOTSUPP;1295 1296	skb = ar->wmi.ops->gen_delba_send(ar, vdev_id, mac, tid, initiator,1297					  reason);1298	if (IS_ERR(skb))1299		return PTR_ERR(skb);1300 1301	return ath10k_wmi_cmd_send(ar, skb,1302				   ar->wmi.cmd->delba_send_cmdid);1303}1304 1305static inline int1306ath10k_wmi_bcn_tmpl(struct ath10k *ar, u32 vdev_id, u32 tim_ie_offset,1307		    struct sk_buff *bcn, u32 prb_caps, u32 prb_erp,1308		    void *prb_ies, size_t prb_ies_len)1309{1310	struct sk_buff *skb;1311 1312	if (!ar->wmi.ops->gen_bcn_tmpl)1313		return -EOPNOTSUPP;1314 1315	skb = ar->wmi.ops->gen_bcn_tmpl(ar, vdev_id, tim_ie_offset, bcn,1316					prb_caps, prb_erp, prb_ies,1317					prb_ies_len);1318	if (IS_ERR(skb))1319		return PTR_ERR(skb);1320 1321	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->bcn_tmpl_cmdid);1322}1323 1324static inline int1325ath10k_wmi_prb_tmpl(struct ath10k *ar, u32 vdev_id, struct sk_buff *prb)1326{1327	struct sk_buff *skb;1328 1329	if (!ar->wmi.ops->gen_prb_tmpl)1330		return -EOPNOTSUPP;1331 1332	skb = ar->wmi.ops->gen_prb_tmpl(ar, vdev_id, prb);1333	if (IS_ERR(skb))1334		return PTR_ERR(skb);1335 1336	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->prb_tmpl_cmdid);1337}1338 1339static inline int1340ath10k_wmi_p2p_go_bcn_ie(struct ath10k *ar, u32 vdev_id, const u8 *p2p_ie)1341{1342	struct sk_buff *skb;1343 1344	if (!ar->wmi.ops->gen_p2p_go_bcn_ie)1345		return -EOPNOTSUPP;1346 1347	skb = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, vdev_id, p2p_ie);1348	if (IS_ERR(skb))1349		return PTR_ERR(skb);1350 1351	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->p2p_go_set_beacon_ie);1352}1353 1354static inline int1355ath10k_wmi_sta_keepalive(struct ath10k *ar,1356			 const struct wmi_sta_keepalive_arg *arg)1357{1358	struct sk_buff *skb;1359	u32 cmd_id;1360 1361	if (!ar->wmi.ops->gen_sta_keepalive)1362		return -EOPNOTSUPP;1363 1364	skb = ar->wmi.ops->gen_sta_keepalive(ar, arg);1365	if (IS_ERR(skb))1366		return PTR_ERR(skb);1367 1368	cmd_id = ar->wmi.cmd->sta_keepalive_cmd;1369	return ath10k_wmi_cmd_send(ar, skb, cmd_id);1370}1371 1372static inline int1373ath10k_wmi_wow_enable(struct ath10k *ar)1374{1375	struct sk_buff *skb;1376	u32 cmd_id;1377 1378	if (!ar->wmi.ops->gen_wow_enable)1379		return -EOPNOTSUPP;1380 1381	skb = ar->wmi.ops->gen_wow_enable(ar);1382	if (IS_ERR(skb))1383		return PTR_ERR(skb);1384 1385	cmd_id = ar->wmi.cmd->wow_enable_cmdid;1386	return ath10k_wmi_cmd_send(ar, skb, cmd_id);1387}1388 1389static inline int1390ath10k_wmi_wow_add_wakeup_event(struct ath10k *ar, u32 vdev_id,1391				enum wmi_wow_wakeup_event event,1392				u32 enable)1393{1394	struct sk_buff *skb;1395	u32 cmd_id;1396 1397	if (!ar->wmi.ops->gen_wow_add_wakeup_event)1398		return -EOPNOTSUPP;1399 1400	skb = ar->wmi.ops->gen_wow_add_wakeup_event(ar, vdev_id, event, enable);1401	if (IS_ERR(skb))1402		return PTR_ERR(skb);1403 1404	cmd_id = ar->wmi.cmd->wow_enable_disable_wake_event_cmdid;1405	return ath10k_wmi_cmd_send(ar, skb, cmd_id);1406}1407 1408static inline int1409ath10k_wmi_wow_host_wakeup_ind(struct ath10k *ar)1410{1411	struct sk_buff *skb;1412	u32 cmd_id;1413 1414	if (!ar->wmi.ops->gen_wow_host_wakeup_ind)1415		return -EOPNOTSUPP;1416 1417	skb = ar->wmi.ops->gen_wow_host_wakeup_ind(ar);1418	if (IS_ERR(skb))1419		return PTR_ERR(skb);1420 1421	cmd_id = ar->wmi.cmd->wow_hostwakeup_from_sleep_cmdid;1422	return ath10k_wmi_cmd_send(ar, skb, cmd_id);1423}1424 1425static inline int1426ath10k_wmi_wow_add_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id,1427			   const u8 *pattern, const u8 *mask,1428			   int pattern_len, int pattern_offset)1429{1430	struct sk_buff *skb;1431	u32 cmd_id;1432 1433	if (!ar->wmi.ops->gen_wow_add_pattern)1434		return -EOPNOTSUPP;1435 1436	skb = ar->wmi.ops->gen_wow_add_pattern(ar, vdev_id, pattern_id,1437					       pattern, mask, pattern_len,1438					       pattern_offset);1439	if (IS_ERR(skb))1440		return PTR_ERR(skb);1441 1442	cmd_id = ar->wmi.cmd->wow_add_wake_pattern_cmdid;1443	return ath10k_wmi_cmd_send(ar, skb, cmd_id);1444}1445 1446static inline int1447ath10k_wmi_wow_del_pattern(struct ath10k *ar, u32 vdev_id, u32 pattern_id)1448{1449	struct sk_buff *skb;1450	u32 cmd_id;1451 1452	if (!ar->wmi.ops->gen_wow_del_pattern)1453		return -EOPNOTSUPP;1454 1455	skb = ar->wmi.ops->gen_wow_del_pattern(ar, vdev_id, pattern_id);1456	if (IS_ERR(skb))1457		return PTR_ERR(skb);1458 1459	cmd_id = ar->wmi.cmd->wow_del_wake_pattern_cmdid;1460	return ath10k_wmi_cmd_send(ar, skb, cmd_id);1461}1462 1463static inline int1464ath10k_wmi_wow_config_pno(struct ath10k *ar, u32 vdev_id,1465			  struct wmi_pno_scan_req  *pno_scan)1466{1467	struct sk_buff *skb;1468	u32 cmd_id;1469 1470	if (!ar->wmi.ops->gen_wow_config_pno)1471		return -EOPNOTSUPP;1472 1473	skb = ar->wmi.ops->gen_wow_config_pno(ar, vdev_id, pno_scan);1474	if (IS_ERR(skb))1475		return PTR_ERR(skb);1476 1477	cmd_id = ar->wmi.cmd->network_list_offload_config_cmdid;1478	return ath10k_wmi_cmd_send(ar, skb, cmd_id);1479}1480 1481static inline int1482ath10k_wmi_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,1483				enum wmi_tdls_state state)1484{1485	struct sk_buff *skb;1486 1487	if (!ar->wmi.ops->gen_update_fw_tdls_state)1488		return -EOPNOTSUPP;1489 1490	skb = ar->wmi.ops->gen_update_fw_tdls_state(ar, vdev_id, state);1491	if (IS_ERR(skb))1492		return PTR_ERR(skb);1493 1494	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->tdls_set_state_cmdid);1495}1496 1497static inline int1498ath10k_wmi_tdls_peer_update(struct ath10k *ar,1499			    const struct wmi_tdls_peer_update_cmd_arg *arg,1500			    const struct wmi_tdls_peer_capab_arg *cap,1501			    const struct wmi_channel_arg *chan)1502{1503	struct sk_buff *skb;1504 1505	if (!ar->wmi.ops->gen_tdls_peer_update)1506		return -EOPNOTSUPP;1507 1508	skb = ar->wmi.ops->gen_tdls_peer_update(ar, arg, cap, chan);1509	if (IS_ERR(skb))1510		return PTR_ERR(skb);1511 1512	return ath10k_wmi_cmd_send(ar, skb,1513				   ar->wmi.cmd->tdls_peer_update_cmdid);1514}1515 1516static inline int1517ath10k_wmi_adaptive_qcs(struct ath10k *ar, bool enable)1518{1519	struct sk_buff *skb;1520 1521	if (!ar->wmi.ops->gen_adaptive_qcs)1522		return -EOPNOTSUPP;1523 1524	skb = ar->wmi.ops->gen_adaptive_qcs(ar, enable);1525	if (IS_ERR(skb))1526		return PTR_ERR(skb);1527 1528	return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->adaptive_qcs_cmdid);1529}1530 1531static inline int1532ath10k_wmi_pdev_get_tpc_config(struct ath10k *ar, u32 param)1533{1534	struct sk_buff *skb;1535 1536	if (!ar->wmi.ops->gen_pdev_get_tpc_config)1537		return -EOPNOTSUPP;1538 1539	skb = ar->wmi.ops->gen_pdev_get_tpc_config(ar, param);1540 1541	if (IS_ERR(skb))1542		return PTR_ERR(skb);1543 1544	return ath10k_wmi_cmd_send(ar, skb,1545				   ar->wmi.cmd->pdev_get_tpc_config_cmdid);1546}1547 1548static inline int1549ath10k_wmi_fw_stats_fill(struct ath10k *ar, struct ath10k_fw_stats *fw_stats,1550			 char *buf)1551{1552	if (!ar->wmi.ops->fw_stats_fill)1553		return -EOPNOTSUPP;1554 1555	ar->wmi.ops->fw_stats_fill(ar, fw_stats, buf);1556	return 0;1557}1558 1559static inline int1560ath10k_wmi_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,1561				    u32 detect_level, u32 detect_margin)1562{1563	struct sk_buff *skb;1564 1565	if (!ar->wmi.ops->gen_pdev_enable_adaptive_cca)1566		return -EOPNOTSUPP;1567 1568	skb = ar->wmi.ops->gen_pdev_enable_adaptive_cca(ar, enable,1569							detect_level,1570							detect_margin);1571 1572	if (IS_ERR(skb))1573		return PTR_ERR(skb);1574 1575	return ath10k_wmi_cmd_send(ar, skb,1576				   ar->wmi.cmd->pdev_enable_adaptive_cca_cmdid);1577}1578 1579static inline int1580ath10k_wmi_ext_resource_config(struct ath10k *ar,1581			       enum wmi_host_platform_type type,1582			       u32 fw_feature_bitmap)1583{1584	struct sk_buff *skb;1585 1586	if (!ar->wmi.ops->ext_resource_config)1587		return -EOPNOTSUPP;1588 1589	skb = ar->wmi.ops->ext_resource_config(ar, type,1590					       fw_feature_bitmap);1591 1592	if (IS_ERR(skb))1593		return PTR_ERR(skb);1594 1595	return ath10k_wmi_cmd_send(ar, skb,1596				   ar->wmi.cmd->ext_resource_cfg_cmdid);1597}1598 1599static inline int1600ath10k_wmi_get_vdev_subtype(struct ath10k *ar, enum wmi_vdev_subtype subtype)1601{1602	if (!ar->wmi.ops->get_vdev_subtype)1603		return -EOPNOTSUPP;1604 1605	return ar->wmi.ops->get_vdev_subtype(ar, subtype);1606}1607 1608static inline int1609ath10k_wmi_pdev_bss_chan_info_request(struct ath10k *ar,1610				      enum wmi_bss_survey_req_type type)1611{1612	struct ath10k_wmi *wmi = &ar->wmi;1613	struct sk_buff *skb;1614 1615	if (!wmi->ops->gen_pdev_bss_chan_info_req)1616		return -EOPNOTSUPP;1617 1618	skb = wmi->ops->gen_pdev_bss_chan_info_req(ar, type);1619	if (IS_ERR(skb))1620		return PTR_ERR(skb);1621 1622	return ath10k_wmi_cmd_send(ar, skb,1623				   wmi->cmd->pdev_bss_chan_info_request_cmdid);1624}1625 1626static inline int1627ath10k_wmi_echo(struct ath10k *ar, u32 value)1628{1629	struct ath10k_wmi *wmi = &ar->wmi;1630	struct sk_buff *skb;1631 1632	if (!wmi->ops->gen_echo)1633		return -EOPNOTSUPP;1634 1635	skb = wmi->ops->gen_echo(ar, value);1636	if (IS_ERR(skb))1637		return PTR_ERR(skb);1638 1639	return ath10k_wmi_cmd_send(ar, skb, wmi->cmd->echo_cmdid);1640}1641 1642static inline int1643ath10k_wmi_pdev_get_tpc_table_cmdid(struct ath10k *ar, u32 param)1644{1645	struct sk_buff *skb;1646 1647	if (!ar->wmi.ops->gen_pdev_get_tpc_table_cmdid)1648		return -EOPNOTSUPP;1649 1650	skb = ar->wmi.ops->gen_pdev_get_tpc_table_cmdid(ar, param);1651 1652	if (IS_ERR(skb))1653		return PTR_ERR(skb);1654 1655	return ath10k_wmi_cmd_send(ar, skb,1656				   ar->wmi.cmd->pdev_get_tpc_table_cmdid);1657}1658 1659static inline int1660ath10k_wmi_report_radar_found(struct ath10k *ar,1661			      const struct ath10k_radar_found_info *arg)1662{1663	struct sk_buff *skb;1664 1665	if (!ar->wmi.ops->gen_radar_found)1666		return -EOPNOTSUPP;1667 1668	skb = ar->wmi.ops->gen_radar_found(ar, arg);1669	if (IS_ERR(skb))1670		return PTR_ERR(skb);1671 1672	return ath10k_wmi_cmd_send(ar, skb,1673				   ar->wmi.cmd->radar_found_cmdid);1674}1675 1676static inline int1677ath10k_wmi_pdev_bb_timing(struct ath10k *ar,1678			  const struct wmi_bb_timing_cfg_arg *arg)1679{1680	struct sk_buff *skb;1681 1682	if (!ar->wmi.ops->gen_bb_timing)1683		return -EOPNOTSUPP;1684 1685	skb = ar->wmi.ops->gen_bb_timing(ar, arg);1686 1687	if (IS_ERR(skb))1688		return PTR_ERR(skb);1689 1690	return ath10k_wmi_cmd_send(ar, skb,1691				   ar->wmi.cmd->set_bb_timing_cmdid);1692}1693 1694static inline int1695ath10k_wmi_set_per_peer_per_tid_cfg(struct ath10k *ar,1696				    const struct wmi_per_peer_per_tid_cfg_arg *arg)1697{1698	struct sk_buff *skb;1699 1700	if (!ar->wmi.ops->gen_per_peer_per_tid_cfg)1701		return -EOPNOTSUPP;1702 1703	skb = ar->wmi.ops->gen_per_peer_per_tid_cfg(ar, arg);1704	if (IS_ERR(skb))1705		return PTR_ERR(skb);1706 1707	return ath10k_wmi_cmd_send(ar, skb,1708				   ar->wmi.cmd->per_peer_per_tid_config_cmdid);1709}1710#endif1711