wmi-ops.h 27 KB

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