1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name *
5*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name * above copyright notice and this permission notice appear in all
8*5113495bSYour Name * copies.
9*5113495bSYour Name *
10*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name */
19*5113495bSYour Name
20*5113495bSYour Name #ifndef __CDS_SCHED_H
21*5113495bSYour Name #define __CDS_SCHED_H
22*5113495bSYour Name
23*5113495bSYour Name /**
24*5113495bSYour Name * DOC: cds_sched.h
25*5113495bSYour Name * Connectivity driver services scheduler
26*5113495bSYour Name */
27*5113495bSYour Name
28*5113495bSYour Name #include <qdf_event.h>
29*5113495bSYour Name #include <i_qdf_types.h>
30*5113495bSYour Name #include <linux/wait.h>
31*5113495bSYour Name #if defined(CONFIG_HAS_WAKELOCK)
32*5113495bSYour Name #include <linux/wakelock.h>
33*5113495bSYour Name #endif
34*5113495bSYour Name #include <qdf_types.h>
35*5113495bSYour Name #include "qdf_lock.h"
36*5113495bSYour Name #include "qdf_mc_timer.h"
37*5113495bSYour Name #include "cds_config.h"
38*5113495bSYour Name #include "qdf_cpuhp.h"
39*5113495bSYour Name #include "cdp_txrx_cmn_struct.h"
40*5113495bSYour Name
41*5113495bSYour Name #define MC_SUSPEND_EVENT 0x002
42*5113495bSYour Name #define RX_POST_EVENT 0x001
43*5113495bSYour Name #define RX_SUSPEND_EVENT 0x002
44*5113495bSYour Name #define RX_VDEV_DEL_EVENT 0x004
45*5113495bSYour Name #define RX_SHUTDOWN_EVENT 0x010
46*5113495bSYour Name
47*5113495bSYour Name #define RX_REFILL_POST_EVENT 0x001
48*5113495bSYour Name #define RX_REFILL_SUSPEND_EVENT 0x002
49*5113495bSYour Name #define RX_REFILL_SHUTDOWN_EVENT 0x004
50*5113495bSYour Name
51*5113495bSYour Name #ifdef WLAN_DP_LEGACY_OL_RX_THREAD
52*5113495bSYour Name /*
53*5113495bSYour Name ** Maximum number of cds messages to be allocated for
54*5113495bSYour Name ** OL Rx thread.
55*5113495bSYour Name */
56*5113495bSYour Name #define CDS_MAX_OL_RX_PKT 4000
57*5113495bSYour Name
58*5113495bSYour Name #define CDS_ACTIVE_STAID_CLEANUP_DELAY 10
59*5113495bSYour Name #define CDS_ACTIVE_STAID_CLEANUP_TIMEOUT 200
60*5113495bSYour Name #endif
61*5113495bSYour Name
62*5113495bSYour Name typedef void (*cds_ol_rx_thread_cb)(void *context,
63*5113495bSYour Name qdf_nbuf_t rxpkt,
64*5113495bSYour Name uint16_t staid);
65*5113495bSYour Name
66*5113495bSYour Name /*
67*5113495bSYour Name ** CDS message wrapper for data rx from TXRX
68*5113495bSYour Name */
69*5113495bSYour Name struct cds_ol_rx_pkt {
70*5113495bSYour Name struct list_head list;
71*5113495bSYour Name void *context;
72*5113495bSYour Name
73*5113495bSYour Name /* Rx skb */
74*5113495bSYour Name qdf_nbuf_t Rxpkt;
75*5113495bSYour Name
76*5113495bSYour Name /* Station id to which this packet is destined */
77*5113495bSYour Name uint16_t staId;
78*5113495bSYour Name
79*5113495bSYour Name /* Call back to further send this packet to txrx layer */
80*5113495bSYour Name cds_ol_rx_thread_cb callback;
81*5113495bSYour Name
82*5113495bSYour Name };
83*5113495bSYour Name
84*5113495bSYour Name /*
85*5113495bSYour Name ** CDS Scheduler context
86*5113495bSYour Name ** The scheduler context contains the following:
87*5113495bSYour Name ** ** the messages queues
88*5113495bSYour Name ** ** the handle to the thread
89*5113495bSYour Name ** ** pointer to the events that gracefully shutdown the MC and Tx threads
90*5113495bSYour Name **
91*5113495bSYour Name */
92*5113495bSYour Name typedef struct _cds_sched_context {
93*5113495bSYour Name #ifdef WLAN_DP_LEGACY_OL_RX_THREAD
94*5113495bSYour Name spinlock_t ol_rx_thread_lock;
95*5113495bSYour Name
96*5113495bSYour Name /* OL Rx thread handle */
97*5113495bSYour Name struct task_struct *ol_rx_thread;
98*5113495bSYour Name
99*5113495bSYour Name /* Handle of Event for Rx thread to signal startup */
100*5113495bSYour Name struct completion ol_rx_start_event;
101*5113495bSYour Name
102*5113495bSYour Name /* Completion object to suspend OL rx thread */
103*5113495bSYour Name struct completion ol_suspend_rx_event;
104*5113495bSYour Name
105*5113495bSYour Name /* Completion object to resume OL rx thread */
106*5113495bSYour Name struct completion ol_resume_rx_event;
107*5113495bSYour Name
108*5113495bSYour Name /* Completion object for OL Rxthread shutdown */
109*5113495bSYour Name struct completion ol_rx_shutdown;
110*5113495bSYour Name
111*5113495bSYour Name /* Waitq for OL Rx thread */
112*5113495bSYour Name wait_queue_head_t ol_rx_wait_queue;
113*5113495bSYour Name
114*5113495bSYour Name unsigned long ol_rx_event_flag;
115*5113495bSYour Name
116*5113495bSYour Name /* Rx buffer queue */
117*5113495bSYour Name struct list_head ol_rx_thread_queue;
118*5113495bSYour Name
119*5113495bSYour Name /* Spinlock to synchronize between tasklet and thread */
120*5113495bSYour Name spinlock_t ol_rx_queue_lock;
121*5113495bSYour Name
122*5113495bSYour Name /* Lock to synchronize free buffer queue access */
123*5113495bSYour Name spinlock_t cds_ol_rx_pkt_freeq_lock;
124*5113495bSYour Name
125*5113495bSYour Name /* Free message queue for OL Rx processing */
126*5113495bSYour Name struct list_head cds_ol_rx_pkt_freeq;
127*5113495bSYour Name
128*5113495bSYour Name /* The CPU hotplug event registration handle, used to unregister */
129*5113495bSYour Name struct qdf_cpuhp_handler *cpuhp_event_handle;
130*5113495bSYour Name
131*5113495bSYour Name /* affinity lock */
132*5113495bSYour Name struct mutex affinity_lock;
133*5113495bSYour Name
134*5113495bSYour Name /* Saved rx thread CPU affinity */
135*5113495bSYour Name struct cpumask rx_thread_cpu_mask;
136*5113495bSYour Name
137*5113495bSYour Name /* CPU affinity bitmask */
138*5113495bSYour Name uint8_t conf_rx_thread_cpu_mask;
139*5113495bSYour Name
140*5113495bSYour Name /* high throughput required */
141*5113495bSYour Name bool high_throughput_required;
142*5113495bSYour Name
143*5113495bSYour Name /* affinity required during uplink traffic*/
144*5113495bSYour Name bool rx_affinity_required;
145*5113495bSYour Name uint8_t conf_rx_thread_ul_affinity;
146*5113495bSYour Name
147*5113495bSYour Name /* sta id packets under processing in thread context*/
148*5113495bSYour Name uint16_t active_staid;
149*5113495bSYour Name #endif
150*5113495bSYour Name } cds_sched_context, *p_cds_sched_context;
151*5113495bSYour Name
152*5113495bSYour Name /**
153*5113495bSYour Name * struct cds_log_complete - Log completion internal structure
154*5113495bSYour Name * @is_fatal: Type is fatal or not
155*5113495bSYour Name * @indicator: Source of bug report
156*5113495bSYour Name * @reason_code: Reason code for bug report
157*5113495bSYour Name * @is_report_in_progress: If bug report is in progress
158*5113495bSYour Name * @recovery_needed: if recovery is needed after report completion
159*5113495bSYour Name *
160*5113495bSYour Name * This structure internally stores the log related params
161*5113495bSYour Name */
162*5113495bSYour Name struct cds_log_complete {
163*5113495bSYour Name uint32_t is_fatal;
164*5113495bSYour Name uint32_t indicator;
165*5113495bSYour Name uint32_t reason_code;
166*5113495bSYour Name bool is_report_in_progress;
167*5113495bSYour Name bool recovery_needed;
168*5113495bSYour Name };
169*5113495bSYour Name
170*5113495bSYour Name struct cds_context {
171*5113495bSYour Name /* Scheduler Context */
172*5113495bSYour Name cds_sched_context qdf_sched;
173*5113495bSYour Name
174*5113495bSYour Name /* HDD Module Context */
175*5113495bSYour Name void *hdd_context;
176*5113495bSYour Name
177*5113495bSYour Name /* MAC Module Context */
178*5113495bSYour Name void *mac_context;
179*5113495bSYour Name
180*5113495bSYour Name uint32_t driver_state;
181*5113495bSYour Name
182*5113495bSYour Name /* WMA Context */
183*5113495bSYour Name void *wma_context;
184*5113495bSYour Name
185*5113495bSYour Name void *hif_context;
186*5113495bSYour Name
187*5113495bSYour Name void *htc_ctx;
188*5113495bSYour Name
189*5113495bSYour Name void *g_ol_context;
190*5113495bSYour Name /*
191*5113495bSYour Name * qdf_ctx will be used by qdf
192*5113495bSYour Name * while allocating dma memory
193*5113495bSYour Name * to access dev information.
194*5113495bSYour Name */
195*5113495bSYour Name qdf_device_t qdf_ctx;
196*5113495bSYour Name
197*5113495bSYour Name void *dp_soc;
198*5113495bSYour Name
199*5113495bSYour Name /* Configuration handle used to get system configuration */
200*5113495bSYour Name struct cdp_cfg *cfg_ctx;
201*5113495bSYour Name
202*5113495bSYour Name /* radio index per driver */
203*5113495bSYour Name int radio_index;
204*5113495bSYour Name
205*5113495bSYour Name bool is_wakelock_log_enabled;
206*5113495bSYour Name uint32_t wakelock_log_level;
207*5113495bSYour Name uint32_t connectivity_log_level;
208*5113495bSYour Name uint32_t packet_stats_log_level;
209*5113495bSYour Name uint32_t driver_debug_log_level;
210*5113495bSYour Name uint32_t fw_debug_log_level;
211*5113495bSYour Name struct cds_log_complete log_complete;
212*5113495bSYour Name qdf_spinlock_t bug_report_lock;
213*5113495bSYour Name
214*5113495bSYour Name bool enable_fatal_event;
215*5113495bSYour Name struct cds_config_info *cds_cfg;
216*5113495bSYour Name
217*5113495bSYour Name struct ol_tx_sched_wrr_ac_specs_t ac_specs[QCA_WLAN_AC_ALL];
218*5113495bSYour Name qdf_work_t cds_recovery_work;
219*5113495bSYour Name qdf_workqueue_t *cds_recovery_wq;
220*5113495bSYour Name enum qdf_hang_reason recovery_reason;
221*5113495bSYour Name
222*5113495bSYour Name /* To protect bit(CDS_DRIVER_STATE_SYS_REBOOTING) of driver_state */
223*5113495bSYour Name qdf_mutex_t sys_reboot_lock;
224*5113495bSYour Name };
225*5113495bSYour Name
226*5113495bSYour Name /*---------------------------------------------------------------------------
227*5113495bSYour Name Function declarations and documentation
228*5113495bSYour Name ---------------------------------------------------------------------------*/
229*5113495bSYour Name #ifdef WLAN_DP_LEGACY_OL_RX_THREAD
230*5113495bSYour Name
231*5113495bSYour Name /**
232*5113495bSYour Name * cds_sched_handle_cpu_hot_plug() - cpu hotplug event handler
233*5113495bSYour Name *
234*5113495bSYour Name * cpu hotplug indication handler
235*5113495bSYour Name * will find online cores and will assign proper core based on perf requirement
236*5113495bSYour Name *
237*5113495bSYour Name * Return: 0 success
238*5113495bSYour Name * 1 fail
239*5113495bSYour Name */
240*5113495bSYour Name int cds_sched_handle_cpu_hot_plug(void);
241*5113495bSYour Name
242*5113495bSYour Name /**
243*5113495bSYour Name * cds_sched_handle_throughput_req() - cpu throughput requirement handler
244*5113495bSYour Name * @high_tput_required: high throughput is required or not
245*5113495bSYour Name *
246*5113495bSYour Name * high or low throughput indication handler
247*5113495bSYour Name * will find online cores and will assign proper core based on perf requirement
248*5113495bSYour Name *
249*5113495bSYour Name * Return: 0 success
250*5113495bSYour Name * 1 fail
251*5113495bSYour Name */
252*5113495bSYour Name int cds_sched_handle_throughput_req(bool high_tput_required);
253*5113495bSYour Name
254*5113495bSYour Name /**
255*5113495bSYour Name * cds_sched_handle_rx_thread_affinity_req() - rx thread affinity req handler
256*5113495bSYour Name * @high_throughput: high throughput is required or not
257*5113495bSYour Name *
258*5113495bSYour Name * rx thread affinity handler will find online cores and
259*5113495bSYour Name * will assign proper core based on perf requirement
260*5113495bSYour Name *
261*5113495bSYour Name * Return: None
262*5113495bSYour Name */
263*5113495bSYour Name void cds_sched_handle_rx_thread_affinity_req(bool high_throughput);
264*5113495bSYour Name
265*5113495bSYour Name /**
266*5113495bSYour Name * cds_set_rx_thread_ul_cpu_mask() - Rx_thread affinity for UL from INI
267*5113495bSYour Name * @cpu_affinity_mask: CPU affinity bitmap
268*5113495bSYour Name *
269*5113495bSYour Name * Return:None
270*5113495bSYour Name */
271*5113495bSYour Name void cds_set_rx_thread_ul_cpu_mask(uint8_t cpu_affinity_mask);
272*5113495bSYour Name
273*5113495bSYour Name /**
274*5113495bSYour Name * cds_set_rx_thread_cpu_mask() - Rx_thread affinity from INI
275*5113495bSYour Name * @cpu_affinity_mask: CPU affinity bitmap
276*5113495bSYour Name *
277*5113495bSYour Name * Return:None
278*5113495bSYour Name */
279*5113495bSYour Name void cds_set_rx_thread_cpu_mask(uint8_t cpu_affinity_mask);
280*5113495bSYour Name
281*5113495bSYour Name /**
282*5113495bSYour Name * cds_drop_rxpkt_by_staid() - api to drop pending rx packets for a sta
283*5113495bSYour Name * @pSchedContext: Pointer to the global CDS Sched Context
284*5113495bSYour Name * @staId: Station Id
285*5113495bSYour Name *
286*5113495bSYour Name * This api drops queued packets for a station, to drop all the pending
287*5113495bSYour Name * packets the caller has to send WLAN_MAX_STA_COUNT as staId.
288*5113495bSYour Name *
289*5113495bSYour Name * Return: none
290*5113495bSYour Name */
291*5113495bSYour Name void cds_drop_rxpkt_by_staid(p_cds_sched_context pSchedContext, uint16_t staId);
292*5113495bSYour Name
293*5113495bSYour Name /**
294*5113495bSYour Name * cds_indicate_rxpkt() - indicate rx data packet
295*5113495bSYour Name * @pSchedContext: Pointer to the global CDS Sched Context
296*5113495bSYour Name * @pkt: CDS data message buffer
297*5113495bSYour Name *
298*5113495bSYour Name * This api enqueues the rx packet into ol_rx_thread_queue and notifies
299*5113495bSYour Name * cds_ol_rx_thread()
300*5113495bSYour Name *
301*5113495bSYour Name * Return: none
302*5113495bSYour Name */
303*5113495bSYour Name void cds_indicate_rxpkt(p_cds_sched_context pSchedContext,
304*5113495bSYour Name struct cds_ol_rx_pkt *pkt);
305*5113495bSYour Name
306*5113495bSYour Name /**
307*5113495bSYour Name * cds_close_rx_thread() - close the Rx thread
308*5113495bSYour Name *
309*5113495bSYour Name * This api closes the Rx thread:
310*5113495bSYour Name *
311*5113495bSYour Name * Return: qdf status
312*5113495bSYour Name */
313*5113495bSYour Name QDF_STATUS cds_close_rx_thread(void);
314*5113495bSYour Name
315*5113495bSYour Name /**
316*5113495bSYour Name * cds_alloc_ol_rx_pkt() - API to return next available cds message
317*5113495bSYour Name * @pSchedContext: Pointer to the global CDS Sched Context
318*5113495bSYour Name *
319*5113495bSYour Name * This api returns next available cds message buffer used for rx data
320*5113495bSYour Name * processing
321*5113495bSYour Name *
322*5113495bSYour Name * Return: Pointer to cds message buffer
323*5113495bSYour Name */
324*5113495bSYour Name struct cds_ol_rx_pkt *cds_alloc_ol_rx_pkt(p_cds_sched_context pSchedContext);
325*5113495bSYour Name
326*5113495bSYour Name /**
327*5113495bSYour Name * cds_free_ol_rx_pkt() - api to release cds message to the freeq
328*5113495bSYour Name * @pSchedContext: Pointer to the global CDS Sched Context
329*5113495bSYour Name * @pkt: CDS message buffer to be returned to free queue.
330*5113495bSYour Name *
331*5113495bSYour Name * This api returns the cds message used for Rx data to the free queue
332*5113495bSYour Name *
333*5113495bSYour Name * Return: none
334*5113495bSYour Name */
335*5113495bSYour Name void cds_free_ol_rx_pkt(p_cds_sched_context pSchedContext,
336*5113495bSYour Name struct cds_ol_rx_pkt *pkt);
337*5113495bSYour Name
338*5113495bSYour Name /**
339*5113495bSYour Name * cds_free_ol_rx_pkt_freeq() - free cds buffer free queue
340*5113495bSYour Name * @pSchedContext: pointer to the global CDS Sched Context
341*5113495bSYour Name *
342*5113495bSYour Name * This API does mem free of the buffers available in free cds buffer
343*5113495bSYour Name * queue which is used for Data rx processing.
344*5113495bSYour Name *
345*5113495bSYour Name * Return: none
346*5113495bSYour Name */
347*5113495bSYour Name void cds_free_ol_rx_pkt_freeq(p_cds_sched_context pSchedContext);
348*5113495bSYour Name
349*5113495bSYour Name /**
350*5113495bSYour Name * cds_get_rx_thread_pending() - get rx thread status
351*5113495bSYour Name * @soc: ol_txrx_soc_handle object
352*5113495bSYour Name *
353*5113495bSYour Name * Return: 1 if rx thread is not empty.
354*5113495bSYour Name * 0 if rx thread is empty.
355*5113495bSYour Name */
356*5113495bSYour Name int cds_get_rx_thread_pending(ol_txrx_soc_handle soc);
357*5113495bSYour Name #else
cds_sched_handle_rx_thread_affinity_req(bool high_throughput)358*5113495bSYour Name static inline void cds_sched_handle_rx_thread_affinity_req(
359*5113495bSYour Name bool high_throughput) {}
360*5113495bSYour Name
cds_set_rx_thread_ul_cpu_mask(uint8_t cpu_affinity_mask)361*5113495bSYour Name static inline void cds_set_rx_thread_ul_cpu_mask(uint8_t cpu_affinity_mask) {}
362*5113495bSYour Name
cds_set_rx_thread_cpu_mask(uint8_t cpu_affinity_mask)363*5113495bSYour Name static inline void cds_set_rx_thread_cpu_mask(uint8_t cpu_affinity_mask) {}
364*5113495bSYour Name
365*5113495bSYour Name static inline
cds_drop_rxpkt_by_staid(p_cds_sched_context pSchedContext,uint16_t staId)366*5113495bSYour Name void cds_drop_rxpkt_by_staid(p_cds_sched_context pSchedContext, uint16_t staId)
367*5113495bSYour Name {
368*5113495bSYour Name }
369*5113495bSYour Name
370*5113495bSYour Name static inline
cds_indicate_rxpkt(p_cds_sched_context pSchedContext,struct cds_ol_rx_pkt * pkt)371*5113495bSYour Name void cds_indicate_rxpkt(p_cds_sched_context pSchedContext,
372*5113495bSYour Name struct cds_ol_rx_pkt *pkt)
373*5113495bSYour Name {
374*5113495bSYour Name }
375*5113495bSYour Name
376*5113495bSYour Name static inline
cds_close_rx_thread(void)377*5113495bSYour Name QDF_STATUS cds_close_rx_thread(void)
378*5113495bSYour Name {
379*5113495bSYour Name return QDF_STATUS_SUCCESS;
380*5113495bSYour Name }
381*5113495bSYour Name
382*5113495bSYour Name static inline
cds_alloc_ol_rx_pkt(p_cds_sched_context pSchedContext)383*5113495bSYour Name struct cds_ol_rx_pkt *cds_alloc_ol_rx_pkt(p_cds_sched_context pSchedContext)
384*5113495bSYour Name {
385*5113495bSYour Name return NULL;
386*5113495bSYour Name }
387*5113495bSYour Name
388*5113495bSYour Name static inline
cds_free_ol_rx_pkt(p_cds_sched_context pSchedContext,struct cds_ol_rx_pkt * pkt)389*5113495bSYour Name void cds_free_ol_rx_pkt(p_cds_sched_context pSchedContext,
390*5113495bSYour Name struct cds_ol_rx_pkt *pkt)
391*5113495bSYour Name {
392*5113495bSYour Name }
393*5113495bSYour Name
394*5113495bSYour Name static inline
cds_free_ol_rx_pkt_freeq(p_cds_sched_context pSchedContext)395*5113495bSYour Name void cds_free_ol_rx_pkt_freeq(p_cds_sched_context pSchedContext)
396*5113495bSYour Name {
397*5113495bSYour Name }
398*5113495bSYour Name
cds_sched_handle_throughput_req(bool high_tput_required)399*5113495bSYour Name static inline int cds_sched_handle_throughput_req(
400*5113495bSYour Name bool high_tput_required)
401*5113495bSYour Name {
402*5113495bSYour Name return 0;
403*5113495bSYour Name }
404*5113495bSYour Name
cds_get_rx_thread_pending(ol_txrx_soc_handle soc)405*5113495bSYour Name static inline int cds_get_rx_thread_pending(ol_txrx_soc_handle soc)
406*5113495bSYour Name {
407*5113495bSYour Name return 0;
408*5113495bSYour Name }
409*5113495bSYour Name #endif
410*5113495bSYour Name
411*5113495bSYour Name /**
412*5113495bSYour Name * cds_sched_open() - initialize the CDS Scheduler
413*5113495bSYour Name * @p_cds_context: Pointer to the global CDS Context
414*5113495bSYour Name * @pSchedContext: Pointer to a previously allocated buffer big
415*5113495bSYour Name * enough to hold a scheduler context.
416*5113495bSYour Name * @SchedCtxSize: CDS scheduler context size
417*5113495bSYour Name *
418*5113495bSYour Name * This function initializes the CDS Scheduler
419*5113495bSYour Name * Upon successful initialization:
420*5113495bSYour Name * - All the message queues are initialized
421*5113495bSYour Name * - The Main Controller thread is created and ready to receive and
422*5113495bSYour Name * dispatch messages.
423*5113495bSYour Name *
424*5113495bSYour Name *
425*5113495bSYour Name * Return: QDF status
426*5113495bSYour Name */
427*5113495bSYour Name QDF_STATUS cds_sched_open(void *p_cds_context,
428*5113495bSYour Name p_cds_sched_context pSchedContext,
429*5113495bSYour Name uint32_t SchedCtxSize);
430*5113495bSYour Name
431*5113495bSYour Name /**
432*5113495bSYour Name * cds_sched_close() - close the cds scheduler
433*5113495bSYour Name *
434*5113495bSYour Name * This api closes the CDS Scheduler upon successful closing:
435*5113495bSYour Name * - All the message queues are flushed
436*5113495bSYour Name * - The Main Controller thread is closed
437*5113495bSYour Name * - The Tx thread is closed
438*5113495bSYour Name *
439*5113495bSYour Name *
440*5113495bSYour Name * Return: qdf status
441*5113495bSYour Name */
442*5113495bSYour Name QDF_STATUS cds_sched_close(void);
443*5113495bSYour Name
444*5113495bSYour Name /**
445*5113495bSYour Name * get_cds_sched_ctxt() - get cds scheduler context
446*5113495bSYour Name *
447*5113495bSYour Name * Return: cds scheduler context
448*5113495bSYour Name */
449*5113495bSYour Name p_cds_sched_context get_cds_sched_ctxt(void);
450*5113495bSYour Name
451*5113495bSYour Name void qdf_timer_module_init(void);
452*5113495bSYour Name void qdf_timer_module_deinit(void);
453*5113495bSYour Name
454*5113495bSYour Name /**
455*5113495bSYour Name * cds_ssr_protect_init() - initialize ssr protection debug functionality
456*5113495bSYour Name *
457*5113495bSYour Name * Return:
458*5113495bSYour Name * void
459*5113495bSYour Name */
460*5113495bSYour Name void cds_ssr_protect_init(void);
461*5113495bSYour Name
462*5113495bSYour Name /**
463*5113495bSYour Name * cds_get_gfp_flags(): get GFP flags
464*5113495bSYour Name *
465*5113495bSYour Name * Based on the scheduled context, return GFP flags
466*5113495bSYour Name * Return: gfp flags
467*5113495bSYour Name */
468*5113495bSYour Name int cds_get_gfp_flags(void);
469*5113495bSYour Name
470*5113495bSYour Name /**
471*5113495bSYour Name * cds_shutdown_notifier_register() - Register for shutdown notification
472*5113495bSYour Name * @cb: Call back to be called
473*5113495bSYour Name * @priv: Private pointer to be passed back to call back
474*5113495bSYour Name *
475*5113495bSYour Name * During driver remove or shutdown (recovery), external threads might be stuck
476*5113495bSYour Name * waiting on some event from firmware at lower layers. Remove or shutdown can't
477*5113495bSYour Name * proceed till the thread completes to avoid any race condition. Call backs can
478*5113495bSYour Name * be registered here to get early notification of remove or shutdown so that
479*5113495bSYour Name * waiting thread can be unblocked and hence remove or shutdown can proceed
480*5113495bSYour Name * further as waiting there may not make sense when FW may already have been
481*5113495bSYour Name * down.
482*5113495bSYour Name *
483*5113495bSYour Name * Return: QDF status
484*5113495bSYour Name */
485*5113495bSYour Name QDF_STATUS cds_shutdown_notifier_register(void (*cb)(void *priv), void *priv);
486*5113495bSYour Name
487*5113495bSYour Name /**
488*5113495bSYour Name * cds_shutdown_notifier_purge() - Purge all the notifiers
489*5113495bSYour Name *
490*5113495bSYour Name * Shutdown notifiers are added to provide the early notification of remove or
491*5113495bSYour Name * shutdown being initiated. Adding this API to purge all the registered call
492*5113495bSYour Name * backs as they are not useful any more while all the lower layers are being
493*5113495bSYour Name * shutdown.
494*5113495bSYour Name *
495*5113495bSYour Name * Return: None
496*5113495bSYour Name */
497*5113495bSYour Name void cds_shutdown_notifier_purge(void);
498*5113495bSYour Name
499*5113495bSYour Name /**
500*5113495bSYour Name * cds_shutdown_notifier_call() - Call shutdown notifier call back
501*5113495bSYour Name *
502*5113495bSYour Name * Call registered shutdown notifier call back to indicate about remove or
503*5113495bSYour Name * shutdown.
504*5113495bSYour Name */
505*5113495bSYour Name void cds_shutdown_notifier_call(void);
506*5113495bSYour Name
507*5113495bSYour Name /**
508*5113495bSYour Name * cds_resume_rx_thread() - resume rx thread by completing its resume event
509*5113495bSYour Name *
510*5113495bSYour Name * Resume RX thread by completing RX thread resume event
511*5113495bSYour Name *
512*5113495bSYour Name * Return: None
513*5113495bSYour Name */
514*5113495bSYour Name void cds_resume_rx_thread(void);
515*5113495bSYour Name
516*5113495bSYour Name #endif /* #ifndef __CDS_SCHED_H */
517