xref: /wlan-dirver/qca-wifi-host-cmn/qdf/linux/src/qdf_defer.c (revision a64d8a0dbea74a9757ced8bd24c04bf658d196c7)
1 /*
2  * Copyright (c) 2014-2019,2021 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 /**
20  * DOC: qdf_defer.c
21  * This file provides OS dependent deferred API's.
22  */
23 
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/workqueue.h>
27 
28 #include "i_qdf_defer.h"
29 #include <qdf_module.h>
30 #include <qdf_defer.h>
31 
32 /**
33  * __qdf_defer_func() - defer work handler
34  * @work: Pointer to defer work
35  *
36  * Return: none
37  */
38 void __qdf_defer_func(struct work_struct *work)
39 {
40 	__qdf_work_t *ctx = container_of(work, __qdf_work_t, work);
41 
42 	if (!ctx->fn) {
43 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
44 			  "No callback registered !!");
45 		return;
46 	}
47 	ctx->fn(ctx->arg);
48 }
49 qdf_export_symbol(__qdf_defer_func);
50 
51 #ifdef ENHANCED_OS_ABSTRACTION
52 void
53 qdf_create_bh(qdf_bh_t  *bh, qdf_defer_fn_t  func, void  *arg)
54 {
55 	__qdf_init_bh(bh, func, arg);
56 }
57 
58 void qdf_sched_bh(qdf_bh_t *bh)
59 {
60 	__qdf_sched_bh(bh);
61 }
62 
63 void qdf_destroy_bh(qdf_bh_t *bh)
64 {
65 	__qdf_disable_bh(bh);
66 }
67 
68 void qdf_destroy_work(qdf_handle_t hdl, qdf_work_t *work)
69 {
70 	__qdf_disable_work(work);
71 }
72 
73 qdf_export_symbol(qdf_destroy_work);
74 
75 void qdf_flush_work(qdf_work_t *work)
76 {
77 	__qdf_flush_work(work);
78 }
79 
80 qdf_export_symbol(qdf_flush_work);
81 
82 uint32_t qdf_disable_work(qdf_work_t *work)
83 {
84 	return __qdf_disable_work(work);
85 }
86 
87 qdf_export_symbol(qdf_disable_work);
88 
89 bool qdf_cancel_work(qdf_work_t *work)
90 {
91 	return __qdf_cancel_work(work);
92 }
93 
94 qdf_export_symbol(qdf_cancel_work);
95 
96 qdf_workqueue_t *qdf_create_workqueue(char *name)
97 {
98 	return  __qdf_create_workqueue(name);
99 }
100 
101 qdf_export_symbol(qdf_create_workqueue);
102 
103 qdf_workqueue_t *qdf_create_singlethread_workqueue(char *name)
104 {
105 	return  __qdf_create_singlethread_workqueue(name);
106 }
107 
108 qdf_export_symbol(qdf_create_singlethread_workqueue);
109 
110 void qdf_destroy_workqueue(qdf_handle_t hdl,
111 			   qdf_workqueue_t *wqueue)
112 {
113 	return  __qdf_destroy_workqueue(wqueue);
114 }
115 
116 qdf_export_symbol(qdf_destroy_workqueue);
117 
118 qdf_workqueue_t *qdf_alloc_unbound_workqueue(char *name)
119 {
120 	return  __qdf_alloc_unbound_workqueue(name);
121 }
122 
123 qdf_export_symbol(qdf_alloc_unbound_workqueue);
124 
125 QDF_STATUS qdf_create_work(qdf_handle_t hdl, qdf_work_t  *work,
126 			   qdf_defer_fn_t  func, void  *arg)
127 {
128 	return __qdf_init_work(work, func, arg);
129 }
130 
131 qdf_export_symbol(qdf_create_work);
132 
133 void qdf_sched_work(qdf_handle_t hdl, qdf_work_t *work)
134 {
135 	__qdf_sched_work(work);
136 }
137 
138 qdf_export_symbol(qdf_sched_work);
139 
140 bool
141 qdf_queue_work(qdf_handle_t hdl, qdf_workqueue_t *wqueue, qdf_work_t *work)
142 {
143 	return  __qdf_queue_work(wqueue, work);
144 }
145 
146 qdf_export_symbol(qdf_queue_work);
147 
148 void qdf_flush_workqueue(qdf_handle_t hdl, qdf_workqueue_t *wqueue)
149 {
150 	return  __qdf_flush_workqueue(wqueue);
151 }
152 
153 qdf_export_symbol(qdf_flush_workqueue);
154 #endif
155