xref: /wlan-driver/qca-wifi-host-cmn/qdf/src/qdf_platform.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
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