xref: /wlan-driver/qcacld-3.0/os_if/sync/inc/osif_driver_sync.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2019 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #ifndef __OSIF_DRIVER_SYNC_H
21*5113495bSYour Name #define __OSIF_DRIVER_SYNC_H
22*5113495bSYour Name 
23*5113495bSYour Name #include "qdf_types.h"
24*5113495bSYour Name 
25*5113495bSYour Name /*
26*5113495bSYour Name  * struct osif_driver_sync - opaque synchronization handle for a driver
27*5113495bSYour Name  */
28*5113495bSYour Name struct osif_driver_sync;
29*5113495bSYour Name 
30*5113495bSYour Name /**
31*5113495bSYour Name  * osif_driver_sync_create() - create a driver synchronization context
32*5113495bSYour Name  * @out_driver_sync: out parameter for the new synchronization context
33*5113495bSYour Name  *
34*5113495bSYour Name  * Return: Errno
35*5113495bSYour Name  */
36*5113495bSYour Name qdf_must_check int
37*5113495bSYour Name osif_driver_sync_create(struct osif_driver_sync **out_driver_sync);
38*5113495bSYour Name 
39*5113495bSYour Name /**
40*5113495bSYour Name  * osif_driver_sync_create_and_trans() - create a driver synchronization context
41*5113495bSYour Name  * @out_driver_sync: out parameter for the new synchronization context
42*5113495bSYour Name  *
43*5113495bSYour Name  * For protecting the driver initialization process.
44*5113495bSYour Name  *
45*5113495bSYour Name  * Return: Errno
46*5113495bSYour Name  */
47*5113495bSYour Name #define osif_driver_sync_create_and_trans(out_driver_sync) \
48*5113495bSYour Name 	__osif_driver_sync_create_and_trans(out_driver_sync, __func__)
49*5113495bSYour Name 
50*5113495bSYour Name qdf_must_check int
51*5113495bSYour Name __osif_driver_sync_create_and_trans(struct osif_driver_sync **out_driver_sync,
52*5113495bSYour Name 				    const char *desc);
53*5113495bSYour Name 
54*5113495bSYour Name /**
55*5113495bSYour Name  * osif_driver_sync_destroy() - destroy a driver synchronization context
56*5113495bSYour Name  * @driver_sync: the context to destroy
57*5113495bSYour Name  *
58*5113495bSYour Name  * Return: none
59*5113495bSYour Name  */
60*5113495bSYour Name void osif_driver_sync_destroy(struct osif_driver_sync *driver_sync);
61*5113495bSYour Name 
62*5113495bSYour Name /**
63*5113495bSYour Name  * osif_driver_sync_register() - register a driver for operations/transitions
64*5113495bSYour Name  * @driver_sync: the driver synchronization context to register
65*5113495bSYour Name  *
66*5113495bSYour Name  * Return: none
67*5113495bSYour Name  */
68*5113495bSYour Name void osif_driver_sync_register(struct osif_driver_sync *driver_sync);
69*5113495bSYour Name 
70*5113495bSYour Name /**
71*5113495bSYour Name  * osif_driver_sync_unregister() - unregister a driver for
72*5113495bSYour Name  *	operations/transitions
73*5113495bSYour Name  *
74*5113495bSYour Name  * Return: the driver synchronization context that was registered for @dev
75*5113495bSYour Name  */
76*5113495bSYour Name struct osif_driver_sync *osif_driver_sync_unregister(void);
77*5113495bSYour Name 
78*5113495bSYour Name /**
79*5113495bSYour Name  * osif_driver_sync_trans_start() - attempt to start a driver transition
80*5113495bSYour Name  * @out_driver_sync: out parameter for the synchronization context previously
81*5113495bSYour Name  *	registered, populated on success
82*5113495bSYour Name  *
83*5113495bSYour Name  * Return: Errno
84*5113495bSYour Name  */
85*5113495bSYour Name #define osif_driver_sync_trans_start(out_driver_sync) \
86*5113495bSYour Name 	__osif_driver_sync_trans_start(out_driver_sync, __func__)
87*5113495bSYour Name 
88*5113495bSYour Name qdf_must_check int
89*5113495bSYour Name __osif_driver_sync_trans_start(struct osif_driver_sync **out_driver_sync,
90*5113495bSYour Name 			       const char *desc);
91*5113495bSYour Name 
92*5113495bSYour Name /**
93*5113495bSYour Name  * osif_driver_sync_trans_start_wait() - attempt to start a driver transition,
94*5113495bSYour Name  *	blocking if a conflicting transition is in flight
95*5113495bSYour Name  * @out_driver_sync: out parameter for the synchronization context previously
96*5113495bSYour Name  *	registered, populated on success
97*5113495bSYour Name  *
98*5113495bSYour Name  * Return: Errno
99*5113495bSYour Name  */
100*5113495bSYour Name #define osif_driver_sync_trans_start_wait(out_driver_sync) \
101*5113495bSYour Name 	__osif_driver_sync_trans_start_wait(out_driver_sync, __func__)
102*5113495bSYour Name 
103*5113495bSYour Name qdf_must_check int
104*5113495bSYour Name __osif_driver_sync_trans_start_wait(struct osif_driver_sync **out_driver_sync,
105*5113495bSYour Name 				    const char *desc);
106*5113495bSYour Name 
107*5113495bSYour Name /**
108*5113495bSYour Name  * osif_driver_sync_trans_stop() - stop a transition associated with
109*5113495bSYour Name  *	@driver_sync
110*5113495bSYour Name  * @driver_sync: the synchronization context tracking the transition
111*5113495bSYour Name  *
112*5113495bSYour Name  * Return: none
113*5113495bSYour Name  */
114*5113495bSYour Name void osif_driver_sync_trans_stop(struct osif_driver_sync *driver_sync);
115*5113495bSYour Name 
116*5113495bSYour Name /**
117*5113495bSYour Name  * osif_driver_sync_assert_trans_protected() - assert that the driver is
118*5113495bSYour Name  *	currently protected by a transition
119*5113495bSYour Name  *
120*5113495bSYour Name  * Return: none
121*5113495bSYour Name  */
122*5113495bSYour Name void osif_driver_sync_assert_trans_protected(void);
123*5113495bSYour Name 
124*5113495bSYour Name /**
125*5113495bSYour Name  * osif_driver_sync_op_start() - attempt to start a driver operation
126*5113495bSYour Name  * @out_driver_sync: out parameter for the synchronization context previously
127*5113495bSYour Name  *	registered, populated on success
128*5113495bSYour Name  *
129*5113495bSYour Name  * Return: Errno
130*5113495bSYour Name  */
131*5113495bSYour Name #define osif_driver_sync_op_start(out_driver_sync) \
132*5113495bSYour Name 	__osif_driver_sync_op_start(out_driver_sync, __func__)
133*5113495bSYour Name 
134*5113495bSYour Name qdf_must_check int
135*5113495bSYour Name __osif_driver_sync_op_start(struct osif_driver_sync **out_driver_sync,
136*5113495bSYour Name 			    const char *func);
137*5113495bSYour Name 
138*5113495bSYour Name /**
139*5113495bSYour Name  * osif_driver_sync_op_stop() - stop an operation associated with @driver_sync
140*5113495bSYour Name  * @driver_sync: the synchronization context tracking the operation
141*5113495bSYour Name  *
142*5113495bSYour Name  * Return: none
143*5113495bSYour Name  */
144*5113495bSYour Name #define osif_driver_sync_op_stop(driver_sync) \
145*5113495bSYour Name 	__osif_driver_sync_op_stop(driver_sync, __func__)
146*5113495bSYour Name 
147*5113495bSYour Name void __osif_driver_sync_op_stop(struct osif_driver_sync *driver_sync,
148*5113495bSYour Name 				const char *func);
149*5113495bSYour Name 
150*5113495bSYour Name /**
151*5113495bSYour Name  * osif_driver_sync_wait_for_ops() - wait until all @driver_sync operations
152*5113495bSYour Name  *	complete
153*5113495bSYour Name  * @driver_sync: the synchronization context tracking the operations
154*5113495bSYour Name  *
155*5113495bSYour Name  * Return: None
156*5113495bSYour Name  */
157*5113495bSYour Name void osif_driver_sync_wait_for_ops(struct osif_driver_sync *driver_sync);
158*5113495bSYour Name 
159*5113495bSYour Name #endif /* __OSIF_DRIVER_SYNC_H */
160*5113495bSYour Name 
161