xref: /wlan-dirver/qca-wifi-host-cmn/qdf/src/qdf_platform.c (revision 1397a33f48ea6455be40871470b286e535820eb8)
1 /*
2  * Copyright (c) 2018-2019 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 static qdf_psoc_start_callback           psoc_op_start;
34 static qdf_psoc_stop_callback            psoc_op_stop;
35 
36 
37 void qdf_register_fw_down_callback(qdf_is_fw_down_callback is_fw_down)
38 {
39 	is_fw_down_cb = is_fw_down;
40 }
41 
42 qdf_export_symbol(qdf_register_fw_down_callback);
43 
44 bool qdf_is_fw_down(void)
45 {
46 	if (!is_fw_down_cb) {
47 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
48 			"fw down callback is not registered");
49 			return false;
50 	}
51 
52 	return is_fw_down_cb();
53 }
54 
55 qdf_export_symbol(qdf_is_fw_down);
56 
57 void qdf_register_self_recovery_callback(qdf_self_recovery_callback callback)
58 {
59 	self_recovery_cb = callback;
60 }
61 
62 qdf_export_symbol(qdf_register_self_recovery_callback);
63 
64 void __qdf_trigger_self_recovery(const char *func, const uint32_t line)
65 {
66 	if (self_recovery_cb)
67 		self_recovery_cb(QDF_REASON_UNSPECIFIED, func, line);
68 	else
69 		QDF_DEBUG_PANIC_FL(func, line, "");
70 }
71 
72 qdf_export_symbol(__qdf_trigger_self_recovery);
73 
74 void qdf_register_ssr_protect_callbacks(qdf_ssr_callback protect,
75 					qdf_ssr_callback unprotect)
76 {
77 	ssr_protect_cb   = protect;
78 	ssr_unprotect_cb = unprotect;
79 }
80 
81 qdf_export_symbol(qdf_register_ssr_protect_callbacks);
82 
83 void qdf_ssr_protect(const char *caller)
84 {
85 	if (ssr_protect_cb)
86 		ssr_protect_cb(caller);
87 }
88 
89 qdf_export_symbol(qdf_ssr_protect);
90 
91 void qdf_ssr_unprotect(const char *caller)
92 {
93 	if (ssr_unprotect_cb)
94 		ssr_unprotect_cb(caller);
95 }
96 
97 qdf_export_symbol(qdf_ssr_unprotect);
98 
99 void qdf_register_module_state_query_callback(
100 			qdf_is_module_state_transitioning_cb query)
101 {
102 	module_state_transitioning_cb = query;
103 }
104 
105 qdf_export_symbol(qdf_register_module_state_query_callback);
106 
107 bool qdf_is_module_state_transitioning(void)
108 {
109 	if (module_state_transitioning_cb)
110 		return module_state_transitioning_cb();
111 	return false;
112 }
113 
114 qdf_export_symbol(qdf_is_module_state_transitioning);
115 
116 void qdf_register_recovering_state_query_callback(
117 			qdf_is_recovering_callback is_recovering)
118 {
119 	is_recovering_cb = is_recovering;
120 }
121 
122 bool qdf_is_recovering(void)
123 {
124 	if (is_recovering_cb)
125 		return is_recovering_cb();
126 	return false;
127 }
128 
129 qdf_export_symbol(qdf_is_recovering);
130 
131 void qdf_register_dsc_psoc_callbacks(qdf_psoc_start_callback psoc_start,
132 				     qdf_psoc_stop_callback psoc_stop)
133 {
134 	psoc_op_start = psoc_start;
135 	psoc_op_stop  = psoc_stop;
136 }
137 
138 qdf_export_symbol(qdf_register_dsc_psoc_callbacks);
139 
140 QDF_STATUS qdf_psoc_op_start(void)
141 {
142 	if (psoc_op_start)
143 		return psoc_op_start();
144 
145 	return QDF_STATUS_E_INVAL;
146 }
147 
148 qdf_export_symbol(qdf_psoc_op_start);
149 
150 void qdf_psoc_op_stop(void)
151 {
152 	if (psoc_op_stop)
153 		psoc_op_stop();
154 }
155 
156 qdf_export_symbol(qdf_psoc_op_stop);
157