1 /* 2 * Copyright (c) 2014-2020 The Linux Foundation. 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 #if !defined(__SCHEDULER_CORE_H) 20 #define __SCHEDULER_CORE_H 21 22 #include <qdf_threads.h> 23 #include <qdf_timer.h> 24 #include <scheduler_api.h> 25 #include <qdf_list.h> 26 27 #ifndef SCHEDULER_CORE_MAX_MESSAGES 28 #define SCHEDULER_CORE_MAX_MESSAGES 4000 29 #endif 30 #ifndef WLAN_SCHED_REDUCTION_LIMIT 31 #define WLAN_SCHED_REDUCTION_LIMIT 32 32 #endif 33 #define SCHEDULER_NUMBER_OF_MSG_QUEUE 6 34 #define SCHEDULER_WRAPPER_MAX_FAIL_COUNT (SCHEDULER_CORE_MAX_MESSAGES * 3) 35 #define SCHEDULER_WATCHDOG_TIMEOUT (10 * 1000) /* 10s */ 36 37 #define sched_fatal(params...) \ 38 QDF_TRACE_FATAL(QDF_MODULE_ID_SCHEDULER, params) 39 #define sched_err(params...) \ 40 QDF_TRACE_ERROR(QDF_MODULE_ID_SCHEDULER, params) 41 #define sched_warn(params...) \ 42 QDF_TRACE_WARN(QDF_MODULE_ID_SCHEDULER, params) 43 #define sched_info(params...) \ 44 QDF_TRACE_INFO(QDF_MODULE_ID_SCHEDULER, params) 45 #define sched_debug(params...) \ 46 QDF_TRACE_DEBUG(QDF_MODULE_ID_SCHEDULER, params) 47 48 #define sched_nofl_fatal(params...) \ 49 QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_SCHEDULER, params) 50 #define sched_nofl_err(params...) \ 51 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_SCHEDULER, params) 52 #define sched_nofl_warn(params...) \ 53 QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_SCHEDULER, params) 54 #define sched_nofl_info(params...) \ 55 QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_SCHEDULER, params) 56 #define sched_nofl_debug(params...) \ 57 QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_SCHEDULER, params) 58 59 #define sched_enter() sched_debug("Enter") 60 #define sched_exit() sched_debug("Exit") 61 62 /** 63 * struct scheduler_mq_type - scheduler message queue 64 * @mq_lock: message queue lock 65 * @mq_list: message queue list 66 * @qid: queue id 67 */ 68 struct scheduler_mq_type { 69 qdf_spinlock_t mq_lock; 70 qdf_list_t mq_list; 71 QDF_MODULE_ID qid; 72 }; 73 74 /** 75 * struct scheduler_mq_ctx - scheduler message queue context 76 * @sch_msg_q: scheduler message queue 77 * @scheduler_msg_qid_to_qidx: message qid to qidx mapping 78 * @scheduler_msg_process_fn: array of message queue handler function pointers 79 */ 80 struct scheduler_mq_ctx { 81 struct scheduler_mq_type sch_msg_q[SCHEDULER_NUMBER_OF_MSG_QUEUE]; 82 uint8_t scheduler_msg_qid_to_qidx[QDF_MODULE_ID_MAX]; 83 QDF_STATUS (*scheduler_msg_process_fn[SCHEDULER_NUMBER_OF_MSG_QUEUE]) 84 (struct scheduler_msg *msg); 85 }; 86 87 /** 88 * struct scheduler_ctx - scheduler context 89 * @queue_ctx: message queue context 90 * @sch_start_event: scheduler thread start wait event 91 * @sch_thread: scheduler thread 92 * @sch_shutdown: scheduler thread shutdown wait event 93 * @sch_wait_queue: scheduler wait queue 94 * @sch_event_flag: scheduler events flag 95 * @resume_sch_event: scheduler resume wait event 96 * @sch_thread_lock: scheduler thread lock 97 * @sch_last_qidx: scheduler last qidx allocation 98 * @watchdog_msg_type: 'type' of the current msg being processed 99 * @hdd_callback: os if suspend callback 100 * @legacy_wma_handler: legacy wma message handler 101 * @legacy_sys_handler: legacy sys message handler 102 * @timeout: timeout value for scheduler watchdog timer 103 * @watchdog_timer: timer for triggering a scheduler watchdog bite 104 * @watchdog_callback: the callback of the current msg being processed 105 */ 106 struct scheduler_ctx { 107 struct scheduler_mq_ctx queue_ctx; 108 qdf_event_t sch_start_event; 109 qdf_thread_t *sch_thread; 110 qdf_event_t sch_shutdown; 111 qdf_wait_queue_head_t sch_wait_queue; 112 unsigned long sch_event_flag; 113 qdf_event_t resume_sch_event; 114 qdf_spinlock_t sch_thread_lock; 115 uint8_t sch_last_qidx; 116 uint16_t watchdog_msg_type; 117 hdd_suspend_callback hdd_callback; 118 scheduler_msg_process_fn_t legacy_wma_handler; 119 scheduler_msg_process_fn_t legacy_sys_handler; 120 uint32_t timeout; 121 qdf_timer_t watchdog_timer; 122 void *watchdog_callback; 123 }; 124 125 /** 126 * scheduler_core_msg_dup() duplicate the given scheduler message 127 * @msg: the message to duplicated 128 * 129 * Note: Duplicated messages must be freed using scheduler_core_msg_free(). 130 * 131 * Return: pointer to the duplicated message 132 */ 133 struct scheduler_msg *scheduler_core_msg_dup(struct scheduler_msg *msg); 134 135 /** 136 * scheduler_core_msg_free() - free the given scheduler message 137 * @msg: the duplicated message to free 138 * 139 * Return: None 140 */ 141 void scheduler_core_msg_free(struct scheduler_msg *msg); 142 143 /** 144 * scheduler_get_context() - to get scheduler context 145 * 146 * This routine is used retrieve scheduler context 147 * 148 * Return: Pointer to scheduler context 149 */ 150 struct scheduler_ctx *scheduler_get_context(void); 151 152 /** 153 * scheduler_thread() - spawned thread will execute this routine 154 * @arg: pointer to scheduler context 155 * 156 * Newly created thread will use this routine to perform its duty 157 * 158 * Return: none 159 */ 160 int scheduler_thread(void *arg); 161 162 /** 163 * scheduler_create_ctx() - to create scheduler context 164 * 165 * This routine is used to create scheduler context 166 * 167 * Return: QDF_STATUS based on success or failure 168 */ 169 QDF_STATUS scheduler_create_ctx(void); 170 /** 171 * scheduler_destroy_ctx() - to destroy scheduler context 172 * 173 * This routine is used to destroy scheduler context 174 * 175 * Return: QDF_STATUS based on success or failure 176 */ 177 QDF_STATUS scheduler_destroy_ctx(void); 178 179 /** 180 * scheduler_mq_put() - put message in the back of queue 181 * @msg_q: Pointer to the message queue 182 * @msg: the message to enqueue 183 * 184 * This function is used to put message in back of provided message 185 * queue 186 * 187 * Return: none 188 */ 189 void scheduler_mq_put(struct scheduler_mq_type *msg_q, 190 struct scheduler_msg *msg); 191 /** 192 * scheduler_mq_put_front() - put message in the front of queue 193 * @msg_q: Pointer to the message queue 194 * @msg: the message to enqueue 195 * 196 * This function is used to put message in front of provided message 197 * queue 198 * 199 * Return: none 200 */ 201 void scheduler_mq_put_front(struct scheduler_mq_type *msg_q, 202 struct scheduler_msg *msg); 203 /** 204 * scheduler_mq_get() - to get message from message queue 205 * @msg_q: Pointer to the message queue 206 * 207 * This function is used to get message from given message queue 208 * 209 * Return: none 210 */ 211 struct scheduler_msg *scheduler_mq_get(struct scheduler_mq_type *msg_q); 212 213 /** 214 * scheduler_queues_init() - to initialize all the modules' queues 215 * @sched_ctx: pointer to scheduler context 216 * 217 * This function is used to initialize the queues for all the modules 218 * 219 * Return: QDF_STATUS based on success of failure 220 */ 221 QDF_STATUS scheduler_queues_init(struct scheduler_ctx *sched_ctx); 222 223 /** 224 * scheduler_queues_deinit() - to de-initialize all the modules' queues 225 * @sched_ctx: pointer to scheduler context 226 * 227 * This function is used to de-initialize the queues for all the modules 228 * 229 * Return: QDF_STATUS based on success of failure 230 */ 231 QDF_STATUS scheduler_queues_deinit(struct scheduler_ctx *gp_sch_ctx); 232 233 /** 234 * scheduler_queues_flush() - flush all of the scheduler queues 235 * @sch_ctx: pointer to scheduler context 236 * 237 * This routine is used to clean the module's queues 238 * 239 * Return: none 240 */ 241 void scheduler_queues_flush(struct scheduler_ctx *sched_ctx); 242 #endif 243