wmi-ops.h 27 KB

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