1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name * Copyright (c) 2023-2024 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 #include "qdf_module.h"
21*5113495bSYour Name #include "qdf_trace.h"
22*5113495bSYour Name #include "qdf_platform.h"
23*5113495bSYour Name
24*5113495bSYour Name /*
25*5113495bSYour Name * The following callbacks should be defined static to make sure they are
26*5113495bSYour Name * initialized to NULL
27*5113495bSYour Name */
28*5113495bSYour Name static qdf_self_recovery_callback self_recovery_cb;
29*5113495bSYour Name static qdf_is_fw_down_callback is_fw_down_cb;
30*5113495bSYour Name static qdf_is_driver_unloading_callback is_driver_unloading_cb;
31*5113495bSYour Name static qdf_is_driver_state_module_stop_callback is_driver_state_module_stop_cb;
32*5113495bSYour Name static qdf_is_recovering_callback is_recovering_cb;
33*5113495bSYour Name static qdf_is_drv_connected_callback is_drv_connected_cb;
34*5113495bSYour Name static qdf_wmi_send_over_qmi_callback _wmi_send_recv_qmi_cb;
35*5113495bSYour Name static qdf_send_ind_over_qmi_callback _qmi_indication_cb;
36*5113495bSYour Name static qdf_is_drv_supported_callback is_drv_supported_cb;
37*5113495bSYour Name static qdf_recovery_reason_update_callback update_recovery_reason_cb;
38*5113495bSYour Name static qdf_bus_reg_dump get_bus_reg_dump;
39*5113495bSYour Name
40*5113495bSYour Name
41*5113495bSYour Name
qdf_register_fw_down_callback(qdf_is_fw_down_callback is_fw_down)42*5113495bSYour Name void qdf_register_fw_down_callback(qdf_is_fw_down_callback is_fw_down)
43*5113495bSYour Name {
44*5113495bSYour Name is_fw_down_cb = is_fw_down;
45*5113495bSYour Name }
46*5113495bSYour Name
47*5113495bSYour Name qdf_export_symbol(qdf_register_fw_down_callback);
48*5113495bSYour Name
qdf_is_fw_down(void)49*5113495bSYour Name bool qdf_is_fw_down(void)
50*5113495bSYour Name {
51*5113495bSYour Name if (!is_fw_down_cb) {
52*5113495bSYour Name QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
53*5113495bSYour Name "fw down callback is not registered");
54*5113495bSYour Name return false;
55*5113495bSYour Name }
56*5113495bSYour Name
57*5113495bSYour Name return is_fw_down_cb();
58*5113495bSYour Name }
59*5113495bSYour Name qdf_export_symbol(qdf_is_fw_down);
60*5113495bSYour Name
qdf_register_wmi_send_recv_qmi_callback(qdf_wmi_send_over_qmi_callback wmi_send_recv_qmi_cb)61*5113495bSYour Name void qdf_register_wmi_send_recv_qmi_callback(qdf_wmi_send_over_qmi_callback
62*5113495bSYour Name wmi_send_recv_qmi_cb)
63*5113495bSYour Name {
64*5113495bSYour Name _wmi_send_recv_qmi_cb = wmi_send_recv_qmi_cb;
65*5113495bSYour Name }
66*5113495bSYour Name
67*5113495bSYour Name qdf_export_symbol(qdf_register_wmi_send_recv_qmi_callback);
68*5113495bSYour Name
qdf_register_qmi_indication_callback(qdf_send_ind_over_qmi_callback cds_qmi_indication)69*5113495bSYour Name void qdf_register_qmi_indication_callback(qdf_send_ind_over_qmi_callback
70*5113495bSYour Name cds_qmi_indication)
71*5113495bSYour Name {
72*5113495bSYour Name _qmi_indication_cb = cds_qmi_indication;
73*5113495bSYour Name }
74*5113495bSYour Name
75*5113495bSYour Name qdf_export_symbol(qdf_register_qmi_indication_callback);
76*5113495bSYour Name
qdf_wmi_send_recv_qmi(void * buf,uint32_t len,void * cb_ctx,qdf_wmi_recv_qmi_cb wmi_recv_qmi_cb)77*5113495bSYour Name QDF_STATUS qdf_wmi_send_recv_qmi(void *buf, uint32_t len, void *cb_ctx,
78*5113495bSYour Name qdf_wmi_recv_qmi_cb wmi_recv_qmi_cb)
79*5113495bSYour Name {
80*5113495bSYour Name if (!_wmi_send_recv_qmi_cb) {
81*5113495bSYour Name QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
82*5113495bSYour Name "Platform callback for WMI over QMI not registered");
83*5113495bSYour Name return QDF_STATUS_E_INVAL;
84*5113495bSYour Name }
85*5113495bSYour Name
86*5113495bSYour Name return _wmi_send_recv_qmi_cb(buf, len, cb_ctx, wmi_recv_qmi_cb);
87*5113495bSYour Name }
88*5113495bSYour Name
89*5113495bSYour Name qdf_export_symbol(qdf_wmi_send_recv_qmi);
90*5113495bSYour Name
qdf_reg_qmi_indication(void * cb_ctx,qdf_qmi_ind_cb qmi_ind_cb)91*5113495bSYour Name QDF_STATUS qdf_reg_qmi_indication(void *cb_ctx, qdf_qmi_ind_cb qmi_ind_cb)
92*5113495bSYour Name {
93*5113495bSYour Name if (!_qmi_indication_cb) {
94*5113495bSYour Name QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
95*5113495bSYour Name "Platform callback for QMI indication not registered");
96*5113495bSYour Name return QDF_STATUS_E_INVAL;
97*5113495bSYour Name }
98*5113495bSYour Name
99*5113495bSYour Name return _qmi_indication_cb(cb_ctx, qmi_ind_cb);
100*5113495bSYour Name }
101*5113495bSYour Name
102*5113495bSYour Name qdf_export_symbol(qdf_reg_qmi_indication);
103*5113495bSYour Name
qdf_register_is_driver_unloading_callback(qdf_is_driver_unloading_callback callback)104*5113495bSYour Name void qdf_register_is_driver_unloading_callback(
105*5113495bSYour Name qdf_is_driver_unloading_callback callback)
106*5113495bSYour Name {
107*5113495bSYour Name is_driver_unloading_cb = callback;
108*5113495bSYour Name }
109*5113495bSYour Name
110*5113495bSYour Name qdf_export_symbol(qdf_register_is_driver_unloading_callback);
111*5113495bSYour Name
qdf_register_is_driver_state_module_stop_callback(qdf_is_driver_state_module_stop_callback callback)112*5113495bSYour Name void qdf_register_is_driver_state_module_stop_callback(
113*5113495bSYour Name qdf_is_driver_state_module_stop_callback callback)
114*5113495bSYour Name {
115*5113495bSYour Name is_driver_state_module_stop_cb = callback;
116*5113495bSYour Name }
117*5113495bSYour Name
118*5113495bSYour Name qdf_export_symbol(qdf_register_is_driver_state_module_stop_callback);
119*5113495bSYour Name
qdf_register_self_recovery_callback(qdf_self_recovery_callback callback)120*5113495bSYour Name void qdf_register_self_recovery_callback(qdf_self_recovery_callback callback)
121*5113495bSYour Name {
122*5113495bSYour Name self_recovery_cb = callback;
123*5113495bSYour Name }
124*5113495bSYour Name
125*5113495bSYour Name qdf_export_symbol(qdf_register_self_recovery_callback);
126*5113495bSYour Name
__qdf_trigger_self_recovery(void * psoc,enum qdf_hang_reason reason,const char * func,const uint32_t line)127*5113495bSYour Name void __qdf_trigger_self_recovery(void *psoc, enum qdf_hang_reason reason,
128*5113495bSYour Name const char *func, const uint32_t line)
129*5113495bSYour Name {
130*5113495bSYour Name if (self_recovery_cb)
131*5113495bSYour Name self_recovery_cb(psoc, reason, func, line);
132*5113495bSYour Name else
133*5113495bSYour Name QDF_DEBUG_PANIC_FL(func, line, "");
134*5113495bSYour Name }
135*5113495bSYour Name
136*5113495bSYour Name qdf_export_symbol(__qdf_trigger_self_recovery);
137*5113495bSYour Name
qdf_register_recovering_state_query_callback(qdf_is_recovering_callback is_recovering)138*5113495bSYour Name void qdf_register_recovering_state_query_callback(
139*5113495bSYour Name qdf_is_recovering_callback is_recovering)
140*5113495bSYour Name {
141*5113495bSYour Name is_recovering_cb = is_recovering;
142*5113495bSYour Name }
143*5113495bSYour Name
qdf_is_driver_unloading(void)144*5113495bSYour Name bool qdf_is_driver_unloading(void)
145*5113495bSYour Name {
146*5113495bSYour Name if (is_driver_unloading_cb)
147*5113495bSYour Name return is_driver_unloading_cb();
148*5113495bSYour Name return false;
149*5113495bSYour Name }
150*5113495bSYour Name
151*5113495bSYour Name qdf_export_symbol(qdf_is_driver_unloading);
152*5113495bSYour Name
qdf_is_driver_state_module_stop(void)153*5113495bSYour Name bool qdf_is_driver_state_module_stop(void)
154*5113495bSYour Name {
155*5113495bSYour Name if (is_driver_state_module_stop_cb)
156*5113495bSYour Name return is_driver_state_module_stop_cb();
157*5113495bSYour Name return false;
158*5113495bSYour Name }
159*5113495bSYour Name
160*5113495bSYour Name qdf_export_symbol(qdf_is_driver_state_module_stop);
161*5113495bSYour Name
qdf_is_recovering(void)162*5113495bSYour Name bool qdf_is_recovering(void)
163*5113495bSYour Name {
164*5113495bSYour Name if (is_recovering_cb)
165*5113495bSYour Name return is_recovering_cb();
166*5113495bSYour Name return false;
167*5113495bSYour Name }
168*5113495bSYour Name
169*5113495bSYour Name qdf_export_symbol(qdf_is_recovering);
170*5113495bSYour Name
171*5113495bSYour Name static qdf_op_protect_cb __on_op_protect;
172*5113495bSYour Name static qdf_op_unprotect_cb __on_op_unprotect;
173*5113495bSYour Name
qdf_op_callbacks_register(qdf_op_protect_cb on_protect,qdf_op_unprotect_cb on_unprotect)174*5113495bSYour Name void qdf_op_callbacks_register(qdf_op_protect_cb on_protect,
175*5113495bSYour Name qdf_op_unprotect_cb on_unprotect)
176*5113495bSYour Name {
177*5113495bSYour Name __on_op_protect = on_protect;
178*5113495bSYour Name __on_op_unprotect = on_unprotect;
179*5113495bSYour Name }
180*5113495bSYour Name qdf_export_symbol(qdf_op_callbacks_register);
181*5113495bSYour Name
__qdf_op_protect(struct qdf_op_sync ** out_sync,const char * func)182*5113495bSYour Name int __qdf_op_protect(struct qdf_op_sync **out_sync, const char *func)
183*5113495bSYour Name {
184*5113495bSYour Name if (!__on_op_protect)
185*5113495bSYour Name return 0;
186*5113495bSYour Name
187*5113495bSYour Name return __on_op_protect((void **)out_sync, func);
188*5113495bSYour Name }
189*5113495bSYour Name qdf_export_symbol(__qdf_op_protect);
190*5113495bSYour Name
__qdf_op_unprotect(struct qdf_op_sync * sync,const char * func)191*5113495bSYour Name void __qdf_op_unprotect(struct qdf_op_sync *sync, const char *func)
192*5113495bSYour Name {
193*5113495bSYour Name if (__on_op_unprotect)
194*5113495bSYour Name __on_op_unprotect(sync, func);
195*5113495bSYour Name }
196*5113495bSYour Name qdf_export_symbol(__qdf_op_unprotect);
197*5113495bSYour Name
qdf_register_drv_connected_callback(qdf_is_drv_connected_callback is_drv_connected)198*5113495bSYour Name void qdf_register_drv_connected_callback(qdf_is_drv_connected_callback
199*5113495bSYour Name is_drv_connected)
200*5113495bSYour Name {
201*5113495bSYour Name is_drv_connected_cb = is_drv_connected;
202*5113495bSYour Name }
203*5113495bSYour Name qdf_export_symbol(qdf_register_drv_connected_callback);
204*5113495bSYour Name
qdf_is_drv_connected(void)205*5113495bSYour Name bool qdf_is_drv_connected(void)
206*5113495bSYour Name {
207*5113495bSYour Name if (!is_drv_connected_cb) {
208*5113495bSYour Name qdf_err("drv connected callback is not registered");
209*5113495bSYour Name return false;
210*5113495bSYour Name }
211*5113495bSYour Name
212*5113495bSYour Name return is_drv_connected_cb();
213*5113495bSYour Name }
214*5113495bSYour Name qdf_export_symbol(qdf_is_drv_connected);
215*5113495bSYour Name
qdf_check_state_before_panic(const char * func,const uint32_t line)216*5113495bSYour Name void qdf_check_state_before_panic(const char *func, const uint32_t line)
217*5113495bSYour Name {
218*5113495bSYour Name if (!qdf_is_recovering() && !qdf_is_fw_down())
219*5113495bSYour Name QDF_DEBUG_PANIC_FL(func, line, "");
220*5113495bSYour Name }
221*5113495bSYour Name
222*5113495bSYour Name qdf_export_symbol(qdf_check_state_before_panic);
223*5113495bSYour Name
qdf_register_drv_supported_callback(qdf_is_drv_supported_callback is_drv_supported)224*5113495bSYour Name void qdf_register_drv_supported_callback(qdf_is_drv_supported_callback
225*5113495bSYour Name is_drv_supported)
226*5113495bSYour Name {
227*5113495bSYour Name is_drv_supported_cb = is_drv_supported;
228*5113495bSYour Name }
229*5113495bSYour Name
230*5113495bSYour Name qdf_export_symbol(qdf_register_drv_supported_callback);
231*5113495bSYour Name
qdf_is_drv_supported(void)232*5113495bSYour Name bool qdf_is_drv_supported(void)
233*5113495bSYour Name {
234*5113495bSYour Name if (!is_drv_supported_cb) {
235*5113495bSYour Name qdf_err("drv supported callback is not registered");
236*5113495bSYour Name return false;
237*5113495bSYour Name }
238*5113495bSYour Name
239*5113495bSYour Name return is_drv_supported_cb();
240*5113495bSYour Name }
241*5113495bSYour Name
242*5113495bSYour Name qdf_export_symbol(qdf_is_drv_supported);
243*5113495bSYour Name
qdf_register_recovery_reason_update(qdf_recovery_reason_update_callback callback)244*5113495bSYour Name void qdf_register_recovery_reason_update(qdf_recovery_reason_update_callback
245*5113495bSYour Name callback)
246*5113495bSYour Name {
247*5113495bSYour Name update_recovery_reason_cb = callback;
248*5113495bSYour Name }
249*5113495bSYour Name
250*5113495bSYour Name qdf_export_symbol(qdf_register_recovery_reason_update);
251*5113495bSYour Name
qdf_recovery_reason_update(enum qdf_hang_reason reason)252*5113495bSYour Name void qdf_recovery_reason_update(enum qdf_hang_reason reason)
253*5113495bSYour Name {
254*5113495bSYour Name if (!update_recovery_reason_cb)
255*5113495bSYour Name return;
256*5113495bSYour Name
257*5113495bSYour Name update_recovery_reason_cb(reason);
258*5113495bSYour Name }
259*5113495bSYour Name
260*5113495bSYour Name qdf_export_symbol(qdf_recovery_reason_update);
261*5113495bSYour Name
qdf_register_get_bus_reg_dump(qdf_bus_reg_dump callback)262*5113495bSYour Name void qdf_register_get_bus_reg_dump(qdf_bus_reg_dump callback)
263*5113495bSYour Name {
264*5113495bSYour Name get_bus_reg_dump = callback;
265*5113495bSYour Name }
266*5113495bSYour Name
267*5113495bSYour Name qdf_export_symbol(qdf_register_get_bus_reg_dump);
268*5113495bSYour Name
qdf_get_bus_reg_dump(struct device * dev,uint8_t * buf,uint32_t len)269*5113495bSYour Name void qdf_get_bus_reg_dump(struct device *dev, uint8_t *buf, uint32_t len)
270*5113495bSYour Name {
271*5113495bSYour Name if (!get_bus_reg_dump)
272*5113495bSYour Name return;
273*5113495bSYour Name
274*5113495bSYour Name get_bus_reg_dump(dev, buf, len);
275*5113495bSYour Name }
276*5113495bSYour Name
277*5113495bSYour Name qdf_export_symbol(qdf_get_bus_reg_dump);
278*5113495bSYour Name
279*5113495bSYour Name #ifdef WLAN_SUPPORT_DPDK
qdf_uio_register_device(struct device * parent,qdf_uio_info_t * info)280*5113495bSYour Name int qdf_uio_register_device(struct device *parent, qdf_uio_info_t *info)
281*5113495bSYour Name {
282*5113495bSYour Name return uio_register_device(parent, (struct uio_info *)info);
283*5113495bSYour Name }
284*5113495bSYour Name
285*5113495bSYour Name qdf_export_symbol(qdf_uio_register_device);
286*5113495bSYour Name
qdf_uio_unregister_device(qdf_uio_info_t * info)287*5113495bSYour Name void qdf_uio_unregister_device(qdf_uio_info_t *info)
288*5113495bSYour Name {
289*5113495bSYour Name uio_unregister_device(info);
290*5113495bSYour Name }
291*5113495bSYour Name
292*5113495bSYour Name qdf_export_symbol(qdf_uio_unregister_device);
293*5113495bSYour Name #endif
294