wlan_twt_api.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /*
  2. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. /**
  19. * DOC: wlan_twt_api.c
  20. * This file defines the APIs of TWT component.
  21. */
  22. #include <wlan_twt_api.h>
  23. #include "twt/core/src/wlan_twt_objmgr_handler.h"
  24. #include "twt/core/src/wlan_twt_common.h"
  25. #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
  26. #include <wlan_pmo_obj_mgmt_api.h>
  27. #endif
  28. struct wlan_lmac_if_twt_tx_ops *
  29. wlan_twt_get_tx_ops(struct wlan_objmgr_psoc *psoc)
  30. {
  31. struct wlan_lmac_if_tx_ops *tx_ops;
  32. tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
  33. if (!tx_ops) {
  34. twt_err("tx_ops is NULL");
  35. return NULL;
  36. }
  37. return &tx_ops->twt_tx_ops;
  38. }
  39. struct wlan_lmac_if_twt_rx_ops *
  40. wlan_twt_get_rx_ops(struct wlan_objmgr_psoc *psoc)
  41. {
  42. struct wlan_lmac_if_rx_ops *rx_ops;
  43. rx_ops = wlan_psoc_get_lmac_if_rxops(psoc);
  44. if (!rx_ops) {
  45. twt_err("rx_ops is NULL");
  46. return NULL;
  47. }
  48. return &rx_ops->twt_rx_ops;
  49. }
  50. struct twt_psoc_priv_obj*
  51. wlan_twt_psoc_get_comp_private_obj(struct wlan_objmgr_psoc *psoc)
  52. {
  53. struct twt_psoc_priv_obj *twt_psoc;
  54. twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc,
  55. WLAN_UMAC_COMP_TWT);
  56. if (!twt_psoc) {
  57. twt_err("TWT PSOC component object is NULL");
  58. return NULL;
  59. }
  60. return twt_psoc;
  61. }
  62. #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
  63. static QDF_STATUS
  64. wlan_twt_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg)
  65. {
  66. wlan_twt_psoc_set_pmo_disable(psoc, REASON_PMO_SUSPEND);
  67. return QDF_STATUS_SUCCESS;
  68. }
  69. static QDF_STATUS
  70. wlan_twt_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg)
  71. {
  72. wlan_twt_psoc_set_pmo_enable(psoc, REASON_PMO_SUSPEND);
  73. return QDF_STATUS_SUCCESS;
  74. }
  75. static void
  76. wlan_twt_register_pmo_handler(void)
  77. {
  78. pmo_register_suspend_handler(WLAN_UMAC_COMP_TWT,
  79. wlan_twt_suspend_handler, NULL);
  80. pmo_register_resume_handler(WLAN_UMAC_COMP_TWT,
  81. wlan_twt_resume_handler, NULL);
  82. }
  83. static inline void
  84. wlan_twt_unregister_pmo_handler(void)
  85. {
  86. pmo_unregister_suspend_handler(WLAN_UMAC_COMP_TWT,
  87. wlan_twt_suspend_handler);
  88. pmo_unregister_resume_handler(WLAN_UMAC_COMP_TWT,
  89. wlan_twt_resume_handler);
  90. }
  91. #else
  92. static void
  93. wlan_twt_register_pmo_handler(void)
  94. {
  95. }
  96. static inline void
  97. wlan_twt_unregister_pmo_handler(void)
  98. {
  99. }
  100. #endif
  101. QDF_STATUS wlan_twt_init(void)
  102. {
  103. QDF_STATUS status = QDF_STATUS_E_FAILURE;
  104. status = wlan_objmgr_register_psoc_create_handler
  105. (WLAN_UMAC_COMP_TWT,
  106. wlan_twt_psoc_obj_create_handler,
  107. NULL);
  108. if (QDF_IS_STATUS_ERROR(status)) {
  109. twt_err("Failed to register psoc create handler");
  110. goto wlan_twt_psoc_init_fail1;
  111. }
  112. status = wlan_objmgr_register_psoc_destroy_handler
  113. (WLAN_UMAC_COMP_TWT,
  114. wlan_twt_psoc_obj_destroy_handler,
  115. NULL);
  116. if (QDF_IS_STATUS_ERROR(status)) {
  117. twt_err("Failed to register psoc destroy handler");
  118. goto wlan_twt_psoc_init_fail2;
  119. }
  120. status = wlan_objmgr_register_vdev_create_handler
  121. (WLAN_UMAC_COMP_TWT,
  122. wlan_twt_vdev_obj_create_handler,
  123. NULL);
  124. if (QDF_IS_STATUS_ERROR(status)) {
  125. twt_err("Failed to register vdev create handler");
  126. goto wlan_twt_vdev_init_fail1;
  127. }
  128. status = wlan_objmgr_register_vdev_destroy_handler
  129. (WLAN_UMAC_COMP_TWT,
  130. wlan_twt_vdev_obj_destroy_handler,
  131. NULL);
  132. if (QDF_IS_STATUS_ERROR(status)) {
  133. twt_err("Failed to register vdev destroy handler");
  134. goto wlan_twt_vdev_init_fail2;
  135. }
  136. status = wlan_objmgr_register_peer_create_handler
  137. (WLAN_UMAC_COMP_TWT,
  138. wlan_twt_peer_obj_create_handler,
  139. NULL);
  140. if (QDF_IS_STATUS_ERROR(status)) {
  141. twt_err("Failed to register peer create handler");
  142. goto wlan_twt_peer_init_fail1;
  143. }
  144. status = wlan_objmgr_register_peer_destroy_handler
  145. (WLAN_UMAC_COMP_TWT,
  146. wlan_twt_peer_obj_destroy_handler,
  147. NULL);
  148. if (QDF_IS_STATUS_ERROR(status)) {
  149. twt_err("Failed to register peer destroy handler");
  150. goto wlan_twt_peer_init_fail2;
  151. }
  152. return QDF_STATUS_SUCCESS;
  153. wlan_twt_peer_init_fail2:
  154. wlan_objmgr_unregister_peer_create_handler
  155. (WLAN_UMAC_COMP_TWT,
  156. wlan_twt_peer_obj_create_handler,
  157. NULL);
  158. wlan_twt_peer_init_fail1:
  159. wlan_objmgr_unregister_vdev_destroy_handler
  160. (WLAN_UMAC_COMP_TWT,
  161. wlan_twt_vdev_obj_destroy_handler,
  162. NULL);
  163. wlan_twt_vdev_init_fail2:
  164. wlan_objmgr_unregister_vdev_create_handler
  165. (WLAN_UMAC_COMP_TWT,
  166. wlan_twt_vdev_obj_create_handler,
  167. NULL);
  168. wlan_twt_vdev_init_fail1:
  169. wlan_objmgr_unregister_psoc_destroy_handler
  170. (WLAN_UMAC_COMP_TWT,
  171. wlan_twt_psoc_obj_destroy_handler,
  172. NULL);
  173. wlan_twt_psoc_init_fail2:
  174. wlan_objmgr_unregister_psoc_create_handler
  175. (WLAN_UMAC_COMP_TWT,
  176. wlan_twt_psoc_obj_create_handler,
  177. NULL);
  178. wlan_twt_psoc_init_fail1:
  179. return status;
  180. }
  181. QDF_STATUS wlan_twt_deinit(void)
  182. {
  183. QDF_STATUS status = QDF_STATUS_E_FAILURE;
  184. status = wlan_objmgr_unregister_psoc_create_handler
  185. (WLAN_UMAC_COMP_TWT,
  186. wlan_twt_psoc_obj_create_handler,
  187. NULL);
  188. if (QDF_IS_STATUS_ERROR(status))
  189. twt_err("Failed to unregister psoc create handler");
  190. status = wlan_objmgr_unregister_psoc_destroy_handler
  191. (WLAN_UMAC_COMP_TWT,
  192. wlan_twt_psoc_obj_destroy_handler,
  193. NULL);
  194. if (QDF_IS_STATUS_ERROR(status))
  195. twt_err("Failed to unregister psoc destroy handler");
  196. status = wlan_objmgr_unregister_vdev_create_handler
  197. (WLAN_UMAC_COMP_TWT,
  198. wlan_twt_vdev_obj_create_handler,
  199. NULL);
  200. if (QDF_IS_STATUS_ERROR(status))
  201. twt_err("Failed to unregister vdev create handler");
  202. status = wlan_objmgr_unregister_vdev_destroy_handler
  203. (WLAN_UMAC_COMP_TWT,
  204. wlan_twt_vdev_obj_destroy_handler,
  205. NULL);
  206. if (QDF_IS_STATUS_ERROR(status))
  207. twt_err("Failed to unregister vdev destroy handler");
  208. status = wlan_objmgr_unregister_peer_create_handler
  209. (WLAN_UMAC_COMP_TWT,
  210. wlan_twt_peer_obj_create_handler,
  211. NULL);
  212. if (QDF_IS_STATUS_ERROR(status))
  213. twt_err("Failed to unregister peer create handler");
  214. status = wlan_objmgr_unregister_peer_destroy_handler
  215. (WLAN_UMAC_COMP_TWT,
  216. wlan_twt_peer_obj_destroy_handler,
  217. NULL);
  218. if (QDF_IS_STATUS_ERROR(status))
  219. twt_err("Failed to unregister peer destroy handler");
  220. return status;
  221. }
  222. QDF_STATUS twt_psoc_enable(struct wlan_objmgr_psoc *psoc)
  223. {
  224. QDF_STATUS status = QDF_STATUS_E_NULL_VALUE;
  225. struct wlan_lmac_if_twt_tx_ops *tx_ops;
  226. tx_ops = wlan_twt_get_tx_ops(psoc);
  227. if (!tx_ops || !tx_ops->register_events) {
  228. twt_err("%s is null", !tx_ops ? "tx_ops" : "register_events");
  229. return QDF_STATUS_E_NULL_VALUE;
  230. }
  231. status = tx_ops->register_events(psoc);
  232. if (QDF_IS_STATUS_ERROR(status))
  233. twt_err("twt_register_events failed (status=%d)", status);
  234. wlan_twt_register_pmo_handler();
  235. return status;
  236. }
  237. QDF_STATUS twt_psoc_disable(struct wlan_objmgr_psoc *psoc)
  238. {
  239. QDF_STATUS status = QDF_STATUS_E_NULL_VALUE;
  240. struct wlan_lmac_if_twt_tx_ops *tx_ops;
  241. tx_ops = wlan_twt_get_tx_ops(psoc);
  242. if (!tx_ops || !tx_ops->deregister_events) {
  243. twt_err("%s is null", !tx_ops ? "tx_ops" : "deregister_events");
  244. return QDF_STATUS_E_NULL_VALUE;
  245. }
  246. status = tx_ops->deregister_events(psoc);
  247. if (QDF_IS_STATUS_ERROR(status))
  248. twt_err("twt_deregister_events failed (status=%d)",
  249. status);
  250. wlan_twt_unregister_pmo_handler();
  251. return status;
  252. }
  253. QDF_STATUS
  254. wlan_set_peer_twt_capabilities(struct wlan_objmgr_psoc *psoc,
  255. struct qdf_mac_addr *peer_mac,
  256. uint8_t peer_cap)
  257. {
  258. return wlan_twt_set_peer_capabilities(psoc, peer_mac, peer_cap);
  259. }