xref: /wlan-dirver/qca-wifi-host-cmn/qdf/inc/qdf_platform.h (revision dd4dc88b837a295134aa9869114a2efee0f4894b)
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 /**
20  * DOC: qdf_platform.h
21  * This file defines platform API abstractions.
22  */
23 
24 #ifndef _QDF_PLATFORM_H
25 #define _QDF_PLATFORM_H
26 
27 #include "qdf_types.h"
28 
29 /**
30  * qdf_self_recovery_callback() - callback for self recovery
31  * @reason: the reason for the recovery request
32  * @func: the caller's function name
33  * @line: the line number of the callsite
34  *
35  * Return: none
36  */
37 typedef void (*qdf_self_recovery_callback)(enum qdf_hang_reason reason,
38 					   const char *func,
39 					   const uint32_t line);
40 
41 /**
42  * qdf_is_fw_down_callback() - callback to query if fw is down
43  *
44  * Return: true if fw is down and false if fw is not down
45  */
46 typedef bool (*qdf_is_fw_down_callback)(void);
47 
48 /**
49  * qdf_register_fw_down_callback() - API to register fw down callback
50  * @is_fw_down: callback to query if fw is down or not
51  *
52  * Return: none
53  */
54 void qdf_register_fw_down_callback(qdf_is_fw_down_callback is_fw_down);
55 
56 /**
57  * qdf_is_fw_down() - API to check if fw is down or not
58  *
59  * Return: true: if fw is down
60  *	   false: if fw is not down
61  */
62 bool qdf_is_fw_down(void);
63 
64 /**
65  * qdf_register_self_recovery_callback() - register self recovery callback
66  * @callback:  self recovery callback
67  *
68  * Return: None
69  */
70 void qdf_register_self_recovery_callback(qdf_self_recovery_callback callback);
71 
72 /**
73  * qdf_trigger_self_recovery () - trigger self recovery
74  * @reason: the reason for the recovery request
75  *
76  * Call API only in case of fatal error,
77  * if self_recovery_cb callback is registered, injcets fw crash and recovers
78  * else raises QDF_BUG()
79  *
80  * Return: None
81  */
82 #define qdf_trigger_self_recovery(reason) \
83 	__qdf_trigger_self_recovery(reason, __func__, __LINE__)
84 void __qdf_trigger_self_recovery(enum qdf_hang_reason reason,
85 				 const char *func, const uint32_t line);
86 
87 /**
88  * qdf_is_recovering_callback() - callback to get driver recovering in progress
89  * or not
90  *
91  * Return: true if driver is doing recovering else false
92  */
93 typedef bool (*qdf_is_recovering_callback)(void);
94 
95 /**
96  * qdf_register_recovering_state_query_callback() - register recover status
97  * query callback
98  *
99  * Return: none
100  */
101 void qdf_register_recovering_state_query_callback(
102 	qdf_is_recovering_callback is_recovering);
103 
104 /**
105  * qdf_is_recovering() - get driver recovering in progress status
106  * or not
107  *
108  * Return: true if driver is doing recovering else false
109  */
110 bool qdf_is_recovering(void);
111 
112 /**
113  * struct qdf_op_sync - opaque operation synchronization context handle
114  */
115 struct qdf_op_sync;
116 
117 typedef int (*qdf_op_protect_cb)(void **out_sync, const char *func);
118 typedef void (*qdf_op_unprotect_cb)(void *sync, const char *func);
119 
120 /**
121  * qdf_op_protect() - attempt to protect a driver operation
122  * @out_sync: output parameter for the synchronization context, populated on
123  *	success
124  *
125  * Return: Errno
126  */
127 #define qdf_op_protect(out_sync) __qdf_op_protect(out_sync, __func__)
128 
129 qdf_must_check int
130 __qdf_op_protect(struct qdf_op_sync **out_sync, const char *func);
131 
132 /**
133  * qdf_op_unprotect() - release driver operation protection
134  * @sync: synchronization context returned from qdf_op_protect()
135  *
136  * Return: None
137  */
138 #define qdf_op_unprotect(sync) __qdf_op_unprotect(sync, __func__)
139 
140 void __qdf_op_unprotect(struct qdf_op_sync *sync, const char *func);
141 
142 /**
143  * qdf_op_callbacks_register() - register driver operation protection callbacks
144  *
145  * Return: None
146  */
147 void qdf_op_callbacks_register(qdf_op_protect_cb on_protect,
148 			       qdf_op_unprotect_cb on_unprotect);
149 
150 /**
151  * qdf_is_drv_connected_callback() - callback to query if drv is connected
152  *
153  * Return: true if drv is connected else false
154  */
155 typedef bool (*qdf_is_drv_connected_callback)(void);
156 
157 /**
158  * qdf_is_drv_connected() - API to check if drv is connected or not
159  *
160  * DRV is dynamic request voting using which fw can do page fault and
161  * bring in page back without apps wake up
162  *
163  * Return: true: if drv is connected
164  *	   false: if drv is not connected
165  */
166 bool qdf_is_drv_connected(void);
167 
168 /**
169  * qdf_register_drv_connected_callback() - API to register drv connected cb
170  * @is_drv_connected: callback to query if drv is connected or not
171  *
172  * Return: none
173  */
174 void qdf_register_drv_connected_callback(qdf_is_drv_connected_callback
175 					 is_drv_connected);
176 
177 #endif /*_QDF_PLATFORM_H*/
178 
179