xref: /wlan-dirver/qca-wifi-host-cmn/qdf/src/qdf_platform.c (revision dae10a5fbc53d54c53c4ba24fa018ad8b1e7c008)
1 /*
2  * Copyright (c) 2018 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 #include "qdf_module.h"
20 #include "qdf_trace.h"
21 #include "qdf_platform.h"
22 
23 /**
24  * The following callbacks should be defined static to make sure they are
25  * initialized to NULL
26  */
27 static qdf_self_recovery_callback           self_recovery_cb;
28 static qdf_ssr_callback                     ssr_protect_cb;
29 static qdf_ssr_callback                     ssr_unprotect_cb;
30 static qdf_is_module_state_transitioning_cb module_state_transitioning_cb;
31 static qdf_is_fw_down_callback		    is_fw_down_cb;
32 
33 void qdf_register_fw_down_callback(qdf_is_fw_down_callback is_fw_down)
34 {
35 	is_fw_down_cb = is_fw_down;
36 }
37 
38 qdf_export_symbol(qdf_register_fw_down_callback);
39 
40 bool qdf_is_fw_down(void)
41 {
42 	if (!is_fw_down_cb) {
43 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
44 			"fw down callback is not registered");
45 			return false;
46 	}
47 
48 	return is_fw_down_cb();
49 }
50 
51 qdf_export_symbol(qdf_is_fw_down);
52 
53 void qdf_register_self_recovery_callback(qdf_self_recovery_callback callback)
54 {
55 	self_recovery_cb = callback;
56 }
57 
58 qdf_export_symbol(qdf_register_self_recovery_callback);
59 
60 void __qdf_trigger_self_recovery(const char *func, const uint32_t line)
61 {
62 	if (self_recovery_cb)
63 		self_recovery_cb(QDF_REASON_UNSPECIFIED, func, line);
64 	else
65 		QDF_DEBUG_PANIC_FL(func, line, "");
66 }
67 
68 qdf_export_symbol(__qdf_trigger_self_recovery);
69 
70 void qdf_register_ssr_protect_callbacks(qdf_ssr_callback protect,
71 					qdf_ssr_callback unprotect)
72 {
73 	ssr_protect_cb   = protect;
74 	ssr_unprotect_cb = unprotect;
75 }
76 
77 qdf_export_symbol(qdf_register_ssr_protect_callbacks);
78 
79 void qdf_ssr_protect(const char *caller)
80 {
81 	if (ssr_protect_cb)
82 		ssr_protect_cb(caller);
83 }
84 
85 qdf_export_symbol(qdf_ssr_protect);
86 
87 void qdf_ssr_unprotect(const char *caller)
88 {
89 	if (ssr_unprotect_cb)
90 		ssr_unprotect_cb(caller);
91 }
92 
93 qdf_export_symbol(qdf_ssr_unprotect);
94 
95 void qdf_register_module_state_query_callback(
96 			qdf_is_module_state_transitioning_cb query)
97 {
98 	module_state_transitioning_cb = query;
99 }
100 
101 qdf_export_symbol(qdf_register_module_state_query_callback);
102 
103 bool qdf_is_module_state_transitioning(void)
104 {
105 	if (module_state_transitioning_cb)
106 		return module_state_transitioning_cb();
107 	return false;
108 }
109 
110 qdf_export_symbol(qdf_is_module_state_transitioning);
111