wlan_spectral_tgt_api.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. /*
  2. * Copyright (c) 2011,2017-2020 The Linux Foundation. All rights reserved.
  3. *
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. #include <wlan_spectral_tgt_api.h>
  20. #include <wlan_spectral_utils_api.h>
  21. #include <target_type.h>
  22. #ifdef DIRECT_BUF_RX_ENABLE
  23. #include <target_if_direct_buf_rx_api.h>
  24. #define DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL 1
  25. #define DBR_NUM_RESP_PER_EVENT_SPECTRAL 2
  26. #endif
  27. void *
  28. tgt_get_pdev_target_handle(struct wlan_objmgr_pdev *pdev)
  29. {
  30. struct pdev_spectral *ps;
  31. if (!pdev) {
  32. spectral_err("PDEV is NULL!");
  33. return NULL;
  34. }
  35. ps = wlan_objmgr_pdev_get_comp_private_obj(pdev,
  36. WLAN_UMAC_COMP_SPECTRAL);
  37. if (!ps) {
  38. spectral_err("PDEV SPECTRAL object is NULL!");
  39. return NULL;
  40. }
  41. return ps->psptrl_target_handle;
  42. }
  43. void *
  44. tgt_get_psoc_target_handle(struct wlan_objmgr_psoc *psoc)
  45. {
  46. struct spectral_context *sc;
  47. if (!psoc) {
  48. spectral_err("psoc is NULL!");
  49. return NULL;
  50. }
  51. sc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
  52. WLAN_UMAC_COMP_SPECTRAL);
  53. if (!sc) {
  54. spectral_err("psoc Spectral object is NULL!");
  55. return NULL;
  56. }
  57. return sc->psoc_target_handle;
  58. }
  59. QDF_STATUS
  60. tgt_spectral_control(
  61. struct wlan_objmgr_pdev *pdev,
  62. struct spectral_cp_request *sscan_req)
  63. {
  64. struct spectral_context *sc;
  65. if (!pdev) {
  66. spectral_err("PDEV is NULL!");
  67. return -EPERM;
  68. }
  69. sc = spectral_get_spectral_ctx_from_pdev(pdev);
  70. if (!sc) {
  71. spectral_err("spectral context is NULL!");
  72. return -EPERM;
  73. }
  74. return spectral_control_cmn(pdev, sscan_req);
  75. }
  76. void *
  77. tgt_pdev_spectral_init(struct wlan_objmgr_pdev *pdev)
  78. {
  79. struct wlan_objmgr_psoc *psoc = NULL;
  80. psoc = wlan_pdev_get_psoc(pdev);
  81. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_init(
  82. pdev);
  83. }
  84. void
  85. tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev *pdev)
  86. {
  87. struct wlan_objmgr_psoc *psoc = NULL;
  88. psoc = wlan_pdev_get_psoc(pdev);
  89. psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_pdev_spectral_deinit(pdev);
  90. }
  91. void *
  92. tgt_psoc_spectral_init(struct wlan_objmgr_psoc *psoc)
  93. {
  94. if (!psoc) {
  95. spectral_err("psoc is null");
  96. return NULL;
  97. }
  98. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_psoc_spectral_init(
  99. psoc);
  100. }
  101. void
  102. tgt_psoc_spectral_deinit(struct wlan_objmgr_psoc *psoc)
  103. {
  104. if (!psoc) {
  105. spectral_err("psoc is null");
  106. return;
  107. }
  108. psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_psoc_spectral_deinit(psoc);
  109. }
  110. QDF_STATUS
  111. tgt_set_spectral_config(struct wlan_objmgr_pdev *pdev,
  112. const struct spectral_cp_param *param,
  113. const enum spectral_scan_mode smode,
  114. enum spectral_cp_error_code *err)
  115. {
  116. struct wlan_objmgr_psoc *psoc = NULL;
  117. psoc = wlan_pdev_get_psoc(pdev);
  118. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_spectral_config(
  119. pdev, param, smode, err);
  120. }
  121. QDF_STATUS
  122. tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev,
  123. struct spectral_config *sptrl_config,
  124. const enum spectral_scan_mode smode)
  125. {
  126. struct wlan_objmgr_psoc *psoc = NULL;
  127. psoc = wlan_pdev_get_psoc(pdev);
  128. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_config(
  129. pdev,
  130. sptrl_config,
  131. smode);
  132. }
  133. QDF_STATUS
  134. tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
  135. enum spectral_scan_mode smode,
  136. enum spectral_cp_error_code *err)
  137. {
  138. struct wlan_objmgr_psoc *psoc = NULL;
  139. psoc = wlan_pdev_get_psoc(pdev);
  140. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_start_spectral_scan(
  141. pdev, smode, err);
  142. }
  143. QDF_STATUS
  144. tgt_stop_spectral_scan(struct wlan_objmgr_pdev *pdev,
  145. enum spectral_scan_mode smode,
  146. enum spectral_cp_error_code *err)
  147. {
  148. struct wlan_objmgr_psoc *psoc;
  149. psoc = wlan_pdev_get_psoc(pdev);
  150. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_stop_spectral_scan(
  151. pdev, smode, err);
  152. }
  153. bool
  154. tgt_is_spectral_active(struct wlan_objmgr_pdev *pdev,
  155. enum spectral_scan_mode smode)
  156. {
  157. struct wlan_objmgr_psoc *psoc = NULL;
  158. psoc = wlan_pdev_get_psoc(pdev);
  159. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_active(
  160. pdev, smode);
  161. }
  162. bool
  163. tgt_is_spectral_enabled(struct wlan_objmgr_pdev *pdev,
  164. enum spectral_scan_mode smode)
  165. {
  166. struct wlan_objmgr_psoc *psoc = NULL;
  167. psoc = wlan_pdev_get_psoc(pdev);
  168. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_is_spectral_enabled(
  169. pdev, smode);
  170. }
  171. QDF_STATUS
  172. tgt_set_debug_level(struct wlan_objmgr_pdev *pdev, u_int32_t debug_level)
  173. {
  174. struct wlan_objmgr_psoc *psoc = NULL;
  175. psoc = wlan_pdev_get_psoc(pdev);
  176. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_debug_level(
  177. pdev,
  178. debug_level);
  179. }
  180. u_int32_t
  181. tgt_get_debug_level(struct wlan_objmgr_pdev *pdev)
  182. {
  183. struct wlan_objmgr_psoc *psoc = NULL;
  184. psoc = wlan_pdev_get_psoc(pdev);
  185. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_debug_level(pdev);
  186. }
  187. QDF_STATUS
  188. tgt_get_spectral_capinfo(struct wlan_objmgr_pdev *pdev,
  189. struct spectral_caps *scaps)
  190. {
  191. struct wlan_objmgr_psoc *psoc = NULL;
  192. psoc = wlan_pdev_get_psoc(pdev);
  193. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_capinfo(
  194. pdev, scaps);
  195. }
  196. QDF_STATUS
  197. tgt_get_spectral_diagstats(struct wlan_objmgr_pdev *pdev,
  198. struct spectral_diag_stats *stats)
  199. {
  200. struct wlan_objmgr_psoc *psoc = NULL;
  201. psoc = wlan_pdev_get_psoc(pdev);
  202. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_get_spectral_diagstats(
  203. pdev, stats);
  204. }
  205. QDF_STATUS
  206. tgt_register_spectral_wmi_ops(struct wlan_objmgr_psoc *psoc,
  207. struct spectral_wmi_ops *wmi_ops)
  208. {
  209. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
  210. if (!psoc) {
  211. spectral_err("psoc is null");
  212. return QDF_STATUS_E_INVAL;
  213. }
  214. if (!wmi_ops) {
  215. spectral_err("WMI operations table is null");
  216. return QDF_STATUS_E_INVAL;
  217. }
  218. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  219. return psptrl_tx_ops->sptrlto_register_spectral_wmi_ops(psoc, wmi_ops);
  220. }
  221. QDF_STATUS
  222. tgt_register_spectral_tgt_ops(struct wlan_objmgr_psoc *psoc,
  223. struct spectral_tgt_ops *tgt_ops)
  224. {
  225. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops;
  226. if (!psoc) {
  227. spectral_err("psoc is null");
  228. return QDF_STATUS_E_INVAL;
  229. }
  230. if (!tgt_ops) {
  231. spectral_err("Target operations table is null");
  232. return QDF_STATUS_E_INVAL;
  233. }
  234. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  235. return psptrl_tx_ops->sptrlto_register_spectral_tgt_ops(psoc,
  236. tgt_ops);
  237. }
  238. void
  239. tgt_spectral_register_nl_cb(
  240. struct wlan_objmgr_pdev *pdev,
  241. struct spectral_nl_cb *nl_cb)
  242. {
  243. struct wlan_objmgr_psoc *psoc = NULL;
  244. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
  245. if (!pdev) {
  246. spectral_err("PDEV is NULL!");
  247. return;
  248. }
  249. psoc = wlan_pdev_get_psoc(pdev);
  250. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  251. return psptrl_tx_ops->sptrlto_register_netlink_cb(pdev,
  252. nl_cb);
  253. }
  254. bool
  255. tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev *pdev)
  256. {
  257. struct wlan_objmgr_psoc *psoc = NULL;
  258. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
  259. psoc = wlan_pdev_get_psoc(pdev);
  260. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  261. return psptrl_tx_ops->sptrlto_use_nl_bcast(pdev);
  262. }
  263. void tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev *pdev)
  264. {
  265. struct wlan_objmgr_psoc *psoc = NULL;
  266. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
  267. if (!pdev) {
  268. spectral_err("PDEV is NULL!");
  269. return;
  270. }
  271. psoc = wlan_pdev_get_psoc(pdev);
  272. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  273. psptrl_tx_ops->sptrlto_deregister_netlink_cb(pdev);
  274. }
  275. int
  276. tgt_spectral_process_report(struct wlan_objmgr_pdev *pdev,
  277. void *payload)
  278. {
  279. struct wlan_objmgr_psoc *psoc = NULL;
  280. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL;
  281. psoc = wlan_pdev_get_psoc(pdev);
  282. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  283. return psptrl_tx_ops->sptrlto_process_spectral_report(pdev, payload);
  284. }
  285. uint32_t
  286. tgt_spectral_get_target_type(struct wlan_objmgr_psoc *psoc)
  287. {
  288. uint32_t target_type = 0;
  289. struct wlan_lmac_if_target_tx_ops *target_type_tx_ops;
  290. target_type_tx_ops = &psoc->soc_cb.tx_ops.target_tx_ops;
  291. if (target_type_tx_ops->tgt_get_tgt_type)
  292. target_type = target_type_tx_ops->tgt_get_tgt_type(psoc);
  293. return target_type;
  294. }
  295. #ifdef DIRECT_BUF_RX_ENABLE
  296. QDF_STATUS
  297. tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev)
  298. {
  299. struct wlan_objmgr_psoc *psoc;
  300. struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL;
  301. struct wlan_lmac_if_sptrl_tx_ops *sptrl_tx_ops = NULL;
  302. struct dbr_module_config dbr_config = {0};
  303. psoc = wlan_pdev_get_psoc(pdev);
  304. dbr_tx_ops = &psoc->soc_cb.tx_ops.dbr_tx_ops;
  305. sptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  306. dbr_config.num_resp_per_event = DBR_NUM_RESP_PER_EVENT_SPECTRAL;
  307. dbr_config.event_timeout_in_ms = DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL;
  308. if ((sptrl_tx_ops->sptrlto_direct_dma_support) &&
  309. (sptrl_tx_ops->sptrlto_direct_dma_support(pdev))) {
  310. if (sptrl_tx_ops->sptrlto_check_and_do_dbr_buff_debug)
  311. sptrl_tx_ops->sptrlto_check_and_do_dbr_buff_debug(pdev);
  312. if (dbr_tx_ops->direct_buf_rx_module_register)
  313. dbr_tx_ops->direct_buf_rx_module_register
  314. (pdev, 0, &dbr_config,
  315. spectral_dbr_event_handler);
  316. if (sptrl_tx_ops->sptrlto_check_and_do_dbr_ring_debug)
  317. sptrl_tx_ops->sptrlto_check_and_do_dbr_ring_debug(pdev);
  318. }
  319. return QDF_STATUS_SUCCESS;
  320. }
  321. QDF_STATUS
  322. tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev)
  323. {
  324. struct wlan_objmgr_psoc *psoc;
  325. struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL;
  326. struct wlan_lmac_if_sptrl_tx_ops *sptrl_tx_ops = NULL;
  327. psoc = wlan_pdev_get_psoc(pdev);
  328. dbr_tx_ops = &psoc->soc_cb.tx_ops.dbr_tx_ops;
  329. sptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  330. if ((sptrl_tx_ops->sptrlto_direct_dma_support) &&
  331. (sptrl_tx_ops->sptrlto_direct_dma_support(pdev))) {
  332. /* Stop DBR debug as the buffers itself are freed now */
  333. if (dbr_tx_ops->direct_buf_rx_stop_ring_debug)
  334. dbr_tx_ops->direct_buf_rx_stop_ring_debug(pdev, 0);
  335. /*No need to zero-out as buffers are anyway getting freed*/
  336. if (dbr_tx_ops->direct_buf_rx_stop_buffer_poisoning)
  337. dbr_tx_ops->direct_buf_rx_stop_buffer_poisoning
  338. (pdev, 0);
  339. if (dbr_tx_ops->direct_buf_rx_module_unregister)
  340. dbr_tx_ops->direct_buf_rx_module_unregister
  341. (pdev, 0);
  342. return QDF_STATUS_SUCCESS;
  343. }
  344. return QDF_STATUS_E_FAILURE;
  345. }
  346. #else
  347. QDF_STATUS
  348. tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev)
  349. {
  350. return QDF_STATUS_SUCCESS;
  351. }
  352. QDF_STATUS
  353. tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev)
  354. {
  355. return QDF_STATUS_SUCCESS;
  356. }
  357. #endif /* DIRECT_BUF_RX_ENABLE */
  358. #ifdef DIRECT_BUF_RX_DEBUG
  359. QDF_STATUS tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev *pdev,
  360. enum spectral_dma_debug dma_debug_type,
  361. bool dma_debug_enable)
  362. {
  363. struct wlan_objmgr_psoc *psoc;
  364. psoc = wlan_pdev_get_psoc(pdev);
  365. if (!psoc) {
  366. spectral_err("psoc is NULL!");
  367. return QDF_STATUS_E_FAILURE;
  368. }
  369. return psoc->soc_cb.tx_ops.sptrl_tx_ops.sptrlto_set_dma_debug(
  370. pdev,
  371. dma_debug_type,
  372. dma_debug_enable);
  373. }
  374. #else
  375. QDF_STATUS tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev *pdev,
  376. enum spectral_dma_debug dma_debug_type,
  377. bool dma_debug_enable)
  378. {
  379. return QDF_STATUS_SUCCESS;
  380. }
  381. #endif
  382. QDF_STATUS
  383. tgt_spectral_register_events(struct wlan_objmgr_psoc *psoc)
  384. {
  385. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops;
  386. if (!psoc) {
  387. spectral_err("psoc is null");
  388. return QDF_STATUS_E_INVAL;
  389. }
  390. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  391. return psptrl_tx_ops->sptrlto_register_events(psoc);
  392. }
  393. QDF_STATUS
  394. tgt_spectral_unregister_events(struct wlan_objmgr_psoc *psoc)
  395. {
  396. struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops;
  397. if (!psoc) {
  398. spectral_err("psoc is null");
  399. return QDF_STATUS_E_INVAL;
  400. }
  401. psptrl_tx_ops = &psoc->soc_cb.tx_ops.sptrl_tx_ops;
  402. return psptrl_tx_ops->sptrlto_unregister_events(psoc);
  403. }