xref: /wlan-dirver/qca-wifi-host-cmn/qdf/src/qdf_platform.c (revision 27d564647e9b50e713c60b0d7e5ea2a9b0a3ae74)
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 static qdf_is_recovering_callback           is_recovering_cb;
33 
34 void qdf_register_fw_down_callback(qdf_is_fw_down_callback is_fw_down)
35 {
36 	is_fw_down_cb = is_fw_down;
37 }
38 
39 qdf_export_symbol(qdf_register_fw_down_callback);
40 
41 bool qdf_is_fw_down(void)
42 {
43 	if (!is_fw_down_cb) {
44 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
45 			"fw down callback is not registered");
46 			return false;
47 	}
48 
49 	return is_fw_down_cb();
50 }
51 
52 qdf_export_symbol(qdf_is_fw_down);
53 
54 void qdf_register_self_recovery_callback(qdf_self_recovery_callback callback)
55 {
56 	self_recovery_cb = callback;
57 }
58 
59 qdf_export_symbol(qdf_register_self_recovery_callback);
60 
61 void __qdf_trigger_self_recovery(const char *func, const uint32_t line)
62 {
63 	if (self_recovery_cb)
64 		self_recovery_cb(QDF_REASON_UNSPECIFIED, func, line);
65 	else
66 		QDF_DEBUG_PANIC_FL(func, line, "");
67 }
68 
69 qdf_export_symbol(__qdf_trigger_self_recovery);
70 
71 void qdf_register_ssr_protect_callbacks(qdf_ssr_callback protect,
72 					qdf_ssr_callback unprotect)
73 {
74 	ssr_protect_cb   = protect;
75 	ssr_unprotect_cb = unprotect;
76 }
77 
78 qdf_export_symbol(qdf_register_ssr_protect_callbacks);
79 
80 void qdf_ssr_protect(const char *caller)
81 {
82 	if (ssr_protect_cb)
83 		ssr_protect_cb(caller);
84 }
85 
86 qdf_export_symbol(qdf_ssr_protect);
87 
88 void qdf_ssr_unprotect(const char *caller)
89 {
90 	if (ssr_unprotect_cb)
91 		ssr_unprotect_cb(caller);
92 }
93 
94 qdf_export_symbol(qdf_ssr_unprotect);
95 
96 void qdf_register_module_state_query_callback(
97 			qdf_is_module_state_transitioning_cb query)
98 {
99 	module_state_transitioning_cb = query;
100 }
101 
102 qdf_export_symbol(qdf_register_module_state_query_callback);
103 
104 bool qdf_is_module_state_transitioning(void)
105 {
106 	if (module_state_transitioning_cb)
107 		return module_state_transitioning_cb();
108 	return false;
109 }
110 
111 qdf_export_symbol(qdf_is_module_state_transitioning);
112 
113 void qdf_register_recovering_state_query_callback(
114 			qdf_is_recovering_callback is_recovering)
115 {
116 	is_recovering_cb = is_recovering;
117 }
118 
119 bool qdf_is_recovering(void)
120 {
121 	if (is_recovering_cb)
122 		return is_recovering_cb();
123 	return false;
124 }
125 
126 qdf_export_symbol(qdf_is_recovering);
127