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