xref: /wlan-dirver/qca-wifi-host-cmn/qdf/src/qdf_platform.c (revision 87a8e4458319c60b618522e263ed900e36aab528)
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 }
65 
66 qdf_export_symbol(__qdf_trigger_self_recovery);
67 
68 void qdf_register_ssr_protect_callbacks(qdf_ssr_callback protect,
69 					qdf_ssr_callback unprotect)
70 {
71 	ssr_protect_cb   = protect;
72 	ssr_unprotect_cb = unprotect;
73 }
74 
75 qdf_export_symbol(qdf_register_ssr_protect_callbacks);
76 
77 void qdf_ssr_protect(const char *caller)
78 {
79 	if (ssr_protect_cb)
80 		ssr_protect_cb(caller);
81 }
82 
83 qdf_export_symbol(qdf_ssr_protect);
84 
85 void qdf_ssr_unprotect(const char *caller)
86 {
87 	if (ssr_unprotect_cb)
88 		ssr_unprotect_cb(caller);
89 }
90 
91 qdf_export_symbol(qdf_ssr_unprotect);
92 
93 void qdf_register_module_state_query_callback(
94 			qdf_is_module_state_transitioning_cb query)
95 {
96 	module_state_transitioning_cb = query;
97 }
98 
99 qdf_export_symbol(qdf_register_module_state_query_callback);
100 
101 bool qdf_is_module_state_transitioning(void)
102 {
103 	if (module_state_transitioning_cb)
104 		return module_state_transitioning_cb();
105 	return false;
106 }
107 
108 qdf_export_symbol(qdf_is_module_state_transitioning);
109