xref: /wlan-driver/qcacld-3.0/core/cds/inc/cds_sched.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
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