scheduler_api.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /*
  2. * Copyright (c) 2014-2017 The Linux Foundation. All rights reserved.
  3. *
  4. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  5. *
  6. *
  7. * Permission to use, copy, modify, and/or distribute this software for
  8. * any purpose with or without fee is hereby granted, provided that the
  9. * above copyright notice and this permission notice appear in all
  10. * copies.
  11. *
  12. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  13. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  14. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  15. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  16. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  17. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  18. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  19. * PERFORMANCE OF THIS SOFTWARE.
  20. */
  21. /*
  22. * This file was originally distributed by Qualcomm Atheros, Inc.
  23. * under proprietary terms before Copyright ownership was assigned
  24. * to the Linux Foundation.
  25. */
  26. #if !defined(__SCHEDULER_API_H)
  27. #define __SCHEDULER_API_H
  28. #include <qdf_event.h>
  29. #include <qdf_types.h>
  30. #include <qdf_lock.h>
  31. #include <qdf_mc_timer.h>
  32. #include <qdf_status.h>
  33. /* Controller thread various event masks
  34. * MC_POST_EVENT_MASK: wake up thread after posting message
  35. * MC_SUSPEND_EVENT_MASK: signal thread to suspend during kernel pm suspend
  36. * MC_SHUTDOWN_EVENT_MASK: signal thread to shutdown and exit during unload
  37. */
  38. #define MC_POST_EVENT_MASK 0x001
  39. #define MC_SUSPEND_EVENT_MASK 0x002
  40. #define MC_SHUTDOWN_EVENT_MASK 0x010
  41. /*
  42. * Cookie for timer messages. Note that anyone posting a timer message
  43. * has to write the COOKIE in the reserved field of the message. The
  44. * timer queue handler relies on this COOKIE
  45. */
  46. #define SYS_MSG_COOKIE 0xFACE
  47. typedef enum {
  48. SYS_MSG_ID_MC_START,
  49. SYS_MSG_ID_MC_THR_PROBE,
  50. SYS_MSG_ID_MC_TIMER,
  51. SYS_MSG_ID_MC_STOP,
  52. SYS_MSG_ID_FTM_RSP,
  53. SYS_MSG_ID_QVIT,
  54. } SYS_MSG_ID;
  55. /**
  56. * struct scheduler_msg: scheduler message structure
  57. * @type: message type
  58. * @reserved: reserved field
  59. * @bodyptr: message body pointer based on the type either a bodyptr pointer
  60. * into memory or bodyval as a 32 bit data is used. bodyptr is always a
  61. * freeable pointer, one should always make sure that bodyptr is always
  62. * freeable.
  63. * Messages should use either bodyptr or bodyval; not both !!!
  64. * @bodyval: message body val
  65. * @callback: callback to be called by scheduler thread once message is posted
  66. * and scheduler thread has started processing the message.
  67. * @flush_callback: flush callback which will be invoked during driver unload
  68. * such that component can release the ref count of common global objects
  69. * like PSOC, PDEV, VDEV and PEER. A component needs to populate flush
  70. * callback in message body pointer for those messages which have taken ref
  71. * count for above mentioned common objects.
  72. */
  73. struct scheduler_msg {
  74. uint16_t type;
  75. uint16_t reserved;
  76. void *bodyptr;
  77. uint32_t bodyval;
  78. void *callback;
  79. void *flush_callback;
  80. };
  81. typedef QDF_STATUS (*scheduler_msg_process_fn_t) (struct scheduler_msg *msg);
  82. typedef void (*hdd_suspend_callback)(void);
  83. /**
  84. * scheduler_init() - initialize control path scheduler
  85. *
  86. * This API initializes control path scheduler.
  87. *
  88. * Return: QDF status
  89. */
  90. QDF_STATUS scheduler_init(void);
  91. /**
  92. * scheduler_deinit() - de-initialize control path scheduler
  93. *
  94. * This API de-initializes control path scheduler.
  95. *
  96. * Return: QDF status
  97. */
  98. QDF_STATUS scheduler_deinit(void);
  99. /**
  100. * scheduler_register_module() - register input module/queue id
  101. * @qid: queue id to get registered
  102. * @callback: queue message to be called when a message is posted
  103. *
  104. * Return: QDF status
  105. */
  106. QDF_STATUS scheduler_register_module(QDF_MODULE_ID qid,
  107. scheduler_msg_process_fn_t callback);
  108. /**
  109. * scheduler_deregister_module() - deregister input module/queue id
  110. * @qid: queue id to get deregistered
  111. *
  112. * Return: QDF status
  113. */
  114. QDF_STATUS scheduler_deregister_module(QDF_MODULE_ID qid);
  115. /**
  116. * scheduler_post_msg_by_priority() - post messages by priority
  117. * @qid: queue id to to post message
  118. * @msg: mesage pointer
  119. * @is_high_priority: set to true for high priority message else false
  120. *
  121. * Return: QDF status
  122. */
  123. QDF_STATUS scheduler_post_msg_by_priority(QDF_MODULE_ID qid,
  124. struct scheduler_msg *msg, bool is_high_priority);
  125. /**
  126. * scheduler_post_msg() - post normal messages(no priority)
  127. * @qid: queue id to to post message
  128. * @msg: mesage pointer
  129. *
  130. * Return: QDF status
  131. */
  132. static inline QDF_STATUS scheduler_post_msg(QDF_MODULE_ID qid,
  133. struct scheduler_msg *msg)
  134. {
  135. return scheduler_post_msg_by_priority(qid, msg, false);
  136. }
  137. /**
  138. * scheduler_resume() - resume scheduler thread
  139. *
  140. * Complete scheduler thread resume wait event such that scheduler
  141. * thread can wake up and process message queues
  142. *
  143. * Return: none
  144. */
  145. void scheduler_resume(void);
  146. /**
  147. * scheduler_register_hdd_suspend_callback() - suspend callback to hdd
  148. * @callback: hdd callback to be called when controllred thread is suspended
  149. *
  150. * Return: none
  151. */
  152. void scheduler_register_hdd_suspend_callback(hdd_suspend_callback callback);
  153. /**
  154. * scheduler_wake_up_controller_thread() - wake up controller thread
  155. *
  156. * Wake up controller thread to process a critical message.
  157. *
  158. * Return: none
  159. */
  160. void scheduler_wake_up_controller_thread(void);
  161. /**
  162. * scheduler_set_event_mask() - set given event mask
  163. * @event_mask: event mask to set
  164. *
  165. * Set given event mask such that controller scheduler thread can do
  166. * specified work after wake up.
  167. *
  168. * Return: none
  169. */
  170. void scheduler_set_event_mask(uint32_t event_mask);
  171. /**
  172. * scheduler_clear_event_mask() - clear given event mask
  173. * @event_mask: event mask to set
  174. *
  175. * Return: none
  176. */
  177. void scheduler_clear_event_mask(uint32_t event_mask);
  178. /**
  179. * scheduler_target_if_mq_handler() - top level message queue handler for
  180. * target_if message queue
  181. * @msg: pointer to actual message being handled
  182. *
  183. * Return: none
  184. */
  185. QDF_STATUS scheduler_target_if_mq_handler(struct scheduler_msg *msg);
  186. /**
  187. * scheduler_os_if_mq_handler() - top level message queue handler for
  188. * os_if message queue
  189. * @msg: pointer to actual message being handled
  190. *
  191. * Return: none
  192. */
  193. QDF_STATUS scheduler_os_if_mq_handler(struct scheduler_msg *msg);
  194. /**
  195. * scheduler_timer_q_mq_handler() - top level message queue handler for
  196. * timer queue
  197. * @msg: pointer to actual message being handled
  198. *
  199. * Return: none
  200. */
  201. QDF_STATUS scheduler_timer_q_mq_handler(struct scheduler_msg *msg);
  202. /**
  203. * scheduler_register_wma_legacy_handler() - register legacy wma handler
  204. * @callback: legacy wma handler to be called for WMA messages
  205. *
  206. * Return: QDF status
  207. */
  208. QDF_STATUS scheduler_register_wma_legacy_handler(scheduler_msg_process_fn_t
  209. callback);
  210. /**
  211. * scheduler_register_sys_legacy_handler() - register legacy sys handler
  212. * @callback: legacy sys handler to be called for sys messages
  213. *
  214. * Return: QDF status
  215. */
  216. QDF_STATUS scheduler_register_sys_legacy_handler(scheduler_msg_process_fn_t
  217. callback);
  218. /**
  219. * scheduler_deregister_sys_legacy_handler() - deregister legacy sys handler
  220. *
  221. * Return: QDF status
  222. */
  223. QDF_STATUS scheduler_deregister_sys_legacy_handler(void);
  224. /**
  225. * scheduler_deregister_wma_legacy_handler() - deregister legacy wma handler
  226. *
  227. * Return: QDF status
  228. */
  229. QDF_STATUS scheduler_deregister_wma_legacy_handler(void);
  230. /**
  231. * scheduler_mc_timer_callback() - timer callback, gets called at time out
  232. * @data: unsigned long, holds the timer object.
  233. *
  234. * Return: None
  235. */
  236. void scheduler_mc_timer_callback(unsigned long data);
  237. #endif