163fa15dbSBob Pearson /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
28700e3e7SMoni Shoua /*
38700e3e7SMoni Shoua  * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
48700e3e7SMoni Shoua  * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
58700e3e7SMoni Shoua  */
68700e3e7SMoni Shoua 
78700e3e7SMoni Shoua #ifndef RXE_TASK_H
88700e3e7SMoni Shoua #define RXE_TASK_H
98700e3e7SMoni Shoua 
108700e3e7SMoni Shoua enum {
118700e3e7SMoni Shoua 	TASK_STATE_START	= 0,
128700e3e7SMoni Shoua 	TASK_STATE_BUSY		= 1,
138700e3e7SMoni Shoua 	TASK_STATE_ARMED	= 2,
148700e3e7SMoni Shoua };
158700e3e7SMoni Shoua 
168700e3e7SMoni Shoua /*
178700e3e7SMoni Shoua  * data structure to describe a 'task' which is a short
188700e3e7SMoni Shoua  * function that returns 0 as long as it needs to be
198700e3e7SMoni Shoua  * called again.
208700e3e7SMoni Shoua  */
218700e3e7SMoni Shoua struct rxe_task {
228700e3e7SMoni Shoua 	struct tasklet_struct	tasklet;
238700e3e7SMoni Shoua 	int			state;
24*63a18baeSBob Pearson 	spinlock_t		lock;
258700e3e7SMoni Shoua 	void			*arg;
268700e3e7SMoni Shoua 	int			(*func)(void *arg);
278700e3e7SMoni Shoua 	int			ret;
2807bf9627SAndrew Boyer 	bool			destroyed;
298700e3e7SMoni Shoua };
308700e3e7SMoni Shoua 
318700e3e7SMoni Shoua /*
328700e3e7SMoni Shoua  * init rxe_task structure
338700e3e7SMoni Shoua  *	arg  => parameter to pass to fcn
345f9e2822SBob Pearson  *	func => function to call until it returns != 0
358700e3e7SMoni Shoua  */
36de669ae8SBob Pearson int rxe_init_task(struct rxe_task *task, void *arg, int (*func)(void *));
378700e3e7SMoni Shoua 
388700e3e7SMoni Shoua /* cleanup task */
398700e3e7SMoni Shoua void rxe_cleanup_task(struct rxe_task *task);
408700e3e7SMoni Shoua 
418700e3e7SMoni Shoua /*
428700e3e7SMoni Shoua  * raw call to func in loop without any checking
438700e3e7SMoni Shoua  * can call when tasklets are disabled
448700e3e7SMoni Shoua  */
458700e3e7SMoni Shoua int __rxe_do_task(struct rxe_task *task);
468700e3e7SMoni Shoua 
47dccb23f6SBob Pearson void rxe_run_task(struct rxe_task *task);
48dccb23f6SBob Pearson 
49dccb23f6SBob Pearson void rxe_sched_task(struct rxe_task *task);
508700e3e7SMoni Shoua 
518700e3e7SMoni Shoua /* keep a task from scheduling */
528700e3e7SMoni Shoua void rxe_disable_task(struct rxe_task *task);
538700e3e7SMoni Shoua 
548700e3e7SMoni Shoua /* allow task to run */
558700e3e7SMoni Shoua void rxe_enable_task(struct rxe_task *task);
568700e3e7SMoni Shoua 
578700e3e7SMoni Shoua #endif /* RXE_TASK_H */
58